2015-06-30 21 views
5

La funzione spread di tidyr prende solo i nomi delle colonne senza virgolette. C'è un modo posso passare in una variabile che contiene il nome di colonna per esempioCome può la funzione tidyr spread assumere come variabile una colonna

# example using gather() 
library("tidyr") 
dummy.data <- data.frame("a" = letters[1:25], "B" = LETTERS[1:5], "x" = c(1:25)) 
dummy.data 
var = "x" 
dummy.data %>% gather(key, value, var) 

Questo dà un errore

Error: All select() inputs must resolve to integer column positions. 
The following do not: 
* var 

Che viene risolto utilizzando funzione match che dà la colonna desiderata posizione

dummy.data %>% gather(key, value, match(var, names(.))) 

Ma questo stesso approccio non funziona per la funzione di diffusione

dummy.data %>% spread(a, match(var, names(.))) 
Error: Invalid column specification 

Le funzioni di raccolta e diffusione richiedono specifiche di colonna diverse. raccogliere prende un indice di colonna, mentre la diffusione non menziona ciò che vuole

+0

avviso che lo spread accetta solo una colonna di valori. Se si desidera diffondere più colonne, è necessario modificarle (incollarle) in una sola e successivamente distribuirle. – dalloliogm

+4

Forse vuoi 'spread_'? Prende le stringhe per entrambe le colonne chiave e valore, però. – aosmith

risposta

1

Se si desidera utilizzare standard di valutazione è necessario utilizzare gather_ o spread_

Questi 2 danno gli stessi risultati

dummy.data %>% gather_("key", "value", var) 
dummy.data %>% gather(key, value, match(var, names(.))) 

E funziona:

dummy.data %>% spread_("a",var) 
# B a b c d e f g h i j k l m n o p q r s t u v w x y 
# 1 A 1 NA NA NA NA 6 NA NA NA NA 11 NA NA NA NA 16 NA NA NA NA 21 NA NA NA NA 
# 2 B NA 2 NA NA NA NA 7 NA NA NA NA 12 NA NA NA NA 17 NA NA NA NA 22 NA NA NA 
# 3 C NA NA 3 NA NA NA NA 8 NA NA NA NA 13 NA NA NA NA 18 NA NA NA NA 23 NA NA 
# 4 D NA NA NA 4 NA NA NA NA 9 NA NA NA NA 14 NA NA NA NA 19 NA NA NA NA 24 NA 
# 5 E NA NA NA NA 5 NA NA NA NA 10 NA NA NA NA 15 NA NA NA NA 20 NA NA NA NA 25