2017-04-21 81 views
0

我想从reshape2使用dcast将数据帧从long转换为wide。reshape2 dcast非二进制运算符的非数字参数

我创建这样一个数据帧:

> 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) 

,并得到,

> 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 

然后,dcast

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

为什么dcast将需要为个人和对象的数值参数列吗?

我试图让这个输出:

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 

*编辑* @neilfws找到了解决办法:

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

然而,当数据帧从一个制表进口分隔文件:

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

the sa我dcast命令返回:

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

你需要指定一个公式,包含'〜',否则,[R认为你试图把两个数相加。也许'个人+对象〜.'? – neilfws

+1

@neilfws:谢谢! 'dcast(df,Person〜。+ Object,variable.var =“Value”)'种类的作品。 – user31888

+0

但是从文件导入相同的数据帧会返回不同的错误(请参阅上面的编辑) – user31888

回答

0

显示如何填充空单元格。

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

太棒了! 'stringsAsfactors = FALSE'甚至解决了导入文件的问题(参见编辑)。谢谢 ! – user31888

0

我们可以使用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 
相关问题