R中的dcast - 创建数据透视表

时间:2015-08-30 01:00:18

标签: r casting pivot-table

这是我的例子

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

有什么想法吗?

2 个答案:

答案 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