2017-04-21 2 views
0

J'essaie de convertir une trame de données de longue à large en utilisant dcast de reshape2.reshape2 argument non numérique dcast à l'opérateur binaire

créer un cadre de données comme ceci:

> Person=c("A","A","A","A","B","B","C","C","C","C") 
> Object=c("car", "watch", "bike", "phone","car","skateboard","car","bike","motorcycle") 
> Value=c("1","1","1","1","1","1","1","1","1","1") 
> df=data.frame(Person, Object, Value) 

et obtenir,

> df 
    Person  Object Value 
1  A  car  1 
2  A  watch  1 
3  A  bike  1 
4  A  phone  1 
5  B  car  1 
6  B skateboard  1 
7  C  car  1 
8  C  bike  1 
9  C motorcycle  1 
10  C   TV  1 

Puis, avec dcast

> library(reshape2) 
> dcast(df, Person + Object, variable.var="Value", fun.aggregate=length) 
Error in Person + Object : non-numeric argument to binary operator 

Pourquoi dcast aurait besoin argument numérique pour personne et objet colonne de toute façon?

Je suis en train d'obtenir cette sortie:

Person car watch bike phone skateboard motorcycle TV 
    A  1  1  1  1    0    0  0 
    B  1  0  0  0    1    0  0 
    C  1  0  1  0    0    1  1 

* EDIT * @neilfws trouvé une solution:

dcast(df, Person ~ . + Object, variable.var="Value") 

Toutefois, lorsque la trame de données est importé d'un tab- fichier délimité:

df = read.table("Person_Object.tab", header=T, sep="\t") 

le sa La commande me dcast renvoie:

Error in eval(expr, envir, enclos) : object 'Person' not found 
+0

Vous devez spécifier une formule contenant un '' ~, sinon R pense que vous essayez d'ajouter deux chiffres. Peut-être 'Person + Object ~. '? – neilfws

+1

@neilfws: Merci! 'dcast (df, Personne ~. + Objet, variable.var =" Valeur ")' type de travaux. – user31888

+0

Mais l'importation de la même trame de données à partir d'un fichier renvoie une erreur différente (voir modification ci-dessus) – user31888

Répondre

0

Comment remplir des cellules vides.

Person=c("A","A","A","A","B","B","C","C","C","C") 
Object=c("car", "watch", "bike", "phone","car","skateboard","car","bike","motorcycle", "TV") 
Value=c("1","1","1","1","1","1","1","1","1","1") 

# note the extra parameter StringsAsFactors - needed so that "0" can be used 
df=data.frame(Person, Object, Value, stringsAsFactors = FALSE) 

library(reshape2) 
dcast(df, Person ~ Object, value.var="Value", fill = "0") 

# Person bike car motorcycle phone skateboard TV watch 
# 1  A 1 1   0  1   0 0  1 
# 2  B 0 1   0  0   1 0  0 
# 3  C 1 1   1  0   0 1  0 
> 
+0

Génial! 'stringsAsfactors = FALSE' a même résolu le problème avec l'importation du fichier (voir modifier). Merci ! – user31888

0

Nous pouvons utiliser tidyverse

library(tidyr) 
df %>% 
    spread(Object, Value, fill = 0) 
# Person bike car motorcycle phone skateboard TV watch 
#1  A 1 1   0  1   0 0  1 
#2  B 0 1   0  0   1 0  0 
#3  C 1 1   1  0   0 1  0