r - 从因子和计数创建列

标签 r plyr

<分区>

一个看似简单的问题让我很忙。

我有一个数据框:

> df1
  Name Score
1  Ben     1
2  Ben     2
3 John     1
4 John     2
5 John     3

我想像这样创建表格的摘要:

> df2
  Name Score_1 Score_2 Score_3
1  Ben       1       1       0
2 John       1       1       1

因此 df2 必须 (i) 仅显示唯一的“姓名”,并且 (ii) 根据“分数”中的唯一因素创建列,并且 (iii) 计算一个人获得该分数的次数。

我试过:

df2 <- ddply(df1, c("Name"), summarise
          ,Score_1 = sum(df1$Score == 1)
          ,Score_2 = sum(df1$Score == 2)
          ,Score_3 = sum(df1$Score == 3))

产生:

  Name Score_1 Score_2 Score_3
1  Ben       2       2       1
2 John       2       2       1

所以我的尝试错误地计算了所有的出现次数,而不是计算“每组”

编辑: 根据评论,还尝试了 reshape (可能只是做错了):

> reshape(df1, idvar = "Name", timevar = "Score", direction = "wide")
  Name
1  Ben
3 John

首先,缺少“分数”列,但更糟糕的是,根据我对 reshape 的研究,我不相信我会得到一个计数 每个因素,这就是重点。

最佳答案

您只需要对您的代码进行一些细微的修改。您应该使用 .(Name) 而不是 c("Name"):

ddply(df1, .(Name), summarise,
      Score_1 = sum(Score == 1),
      Score_2 = sum(Score == 2),
      Score_3 = sum(Score == 3))

给出:

  Name Score_1 Score_2 Score_3
1  Ben       1       1       0
2 John       1       1       1

其他可能性包括:

1. table(df1) 正如@alexis_laz 在comments 中提到的,这给出:

> table(df1)
       Score
Name   1 2 3
  Ben  1 1 0
  John 1 1 1

2.reshape2包(或data.table具有相同dcast 函数):

library(reshape2) # or library(data.table)
dcast(df1, Name ~ paste0("Score_", Score), fun.aggregate = length) 

给出:

  Name Score_1 Score_2 Score_3
1  Ben       1       1       0
2 John       1       1       1

关于r - 从因子和计数创建列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35126517/

相关文章:

r - ddply + summarise 用于在大量列中重复相同的统计函数

R:为选定数量的值减去后续行

r - 使用 ggplot 在 R 中绘制表情符号/表情符号

R:编译问题

r - 如何在 R 中以不同颜色在一个图上绘制多个 ECDF

r - 在函数中使用 ddply 并包含感兴趣的变量作为参数

r - 了解 plyr 的 ddply 函数

r - 优化 R 中的嵌套 foreach dopar

R:如何在 randomForest 中使用长向量?

rdply 和 .id 参数 - NULL 不起作用