【发布时间】:2017-04-21 01:12:17
【问题描述】:
我正在尝试使用来自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 和 Object 列的数字参数?
我正在尝试得到这个输出:
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")
同样的 dcast 命令返回:
Error in eval(expr, envir, enclos) : object 'Person' not found
【问题讨论】:
-
您需要指定一个公式,其中包含一个
~,否则R 认为您正在尝试添加两个数字。也许Person + Object ~ .? -
@neilfws:谢谢!
dcast(df, Person ~ . + Object, variable.var="Value")的作品。 -
但是从文件中导入相同的数据框会返回不同的错误(参见上面的编辑)
-
文件或语法一定有问题。
colnames(df)是否显示名为Person的列? -
是的,
colnames(df)返回[1] "Person" "Object" "Value"