【问题标题】:reshape2 dcast non-numeric argument to binary operatorreshape2 dcast 二元运算符的非数字参数
【发布时间】:2017-04-21 01:12:17
【问题描述】:

我正在尝试使用来自reshape2dcast 将数据帧从长转换为宽。

我创建一个这样的数据框:

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

标签: r reshape2 dcast


【解决方案1】:

显示如何填充空单元格。

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
> 

【讨论】:

  • 太棒了! stringsAsfactors=FALSE 甚至解决了导入文件的问题(见编辑)。谢谢!
【解决方案2】:

我们可以使用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

【讨论】:

    猜你喜欢
    • 2018-08-24
    • 1970-01-01
    • 1970-01-01
    • 2021-03-24
    • 2016-07-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多