这是我的例子
Student <- c('A', 'B', 'B')
Assessor <- c('C', 'D', 'D')
Score <- c(1, 5, 7)
df <- data.frame(Student, Assessor, Score)
df <- dcast(df, Student ~ Assessor,fun.aggregate=(function (x) x), value = 'Score')
print(df)
输出:
Using Score as value column: use value.var to override.
Error in .fun(.value[0], ...) : unused argument (value = "Score")
虽然我想得到像
这样的东西 C D
A 1 NaN
B NaN 5
B NaN 7
我缺少什么?
此外,如果我用
替换Score
Score <- c('foo', 'bar','bar')
输出将是:
Using Score as value column: use value.var to override.
Error in .fun(.value[0], ...) : unused argument (value = "Score")
有什么想法吗?
答案 0 :(得分:2)
由于dcast
在公式左侧的唯一值之间传播,我认为你可以通过(不那么优雅的黑客)实现你的目标,但我敢打赌还有其他方法可以用{{1}也许。
table
通过保持 library(reshape2)
dcast(df, Student + Score ~ ...)[-2]
Using Score as value column: use value.var to override.
Student C D
1 A 1 NA
2 B NA 5
3 B NA 7
和Student
相同然后传播其他变量(在本例中为Score
)并使用Assessor
删除{ {1}}列以获得所需的输出(除非您的第一列实际上是由列名创建的,这在基本R中是不可能的;在这种情况下,您需要[-2]
解决方案)
答案 1 :(得分:0)
使用开发版tidyr
(0.3.0)get it from github。
首先我们完成Student / Assessor的组合,然后我们将它们全部嵌入到列表中,然后将列表分成新行。
library(dplyr)
library(tidyr)
df %>% complete(Student, Assessor) %>%
nest(Score) %>%
spread(Assessor, Score) %>%
unnest(C) %>%
unnest(D)
Student C D
1 A 1 NA
2 B NA 5
3 B NA 7