首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >R-分组数据,但对不同的列应用不同的函数

R-分组数据,但对不同的列应用不同的函数
EN

Stack Overflow用户
提问于 2013-03-15 21:48:36
回答 1查看 1.3K关注 0票数 4

我想对这些数据进行分组,但在分组时对某些列应用不同的函数。

代码语言:javascript
运行
复制
ID  type isDesc isImage
1   1    1      0
1   1    0      1
1   1    0      1
4   2    0      1
4   2    1      0
6   1    1      0
6   1    0      1
6   1    0      0

我想按类型分组,列isDescisImage可以相加,但我想获得ID的值。在整个数据集中,type将是相同的。结果应该如下所示:

代码语言:javascript
运行
复制
ID  type isDesc isImage
1   1    1      2
4   2    1      1
6   1    1      1

目前我正在使用

代码语言:javascript
运行
复制
library(plyr)
summarized = ddply(data, .(ID), numcolwise(sum))

但它只是简单地汇总了所有列。你不一定要使用ddply,但如果你认为它对工作有好处,我会坚持使用它。data.table库也是一种替代方法

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-03-15 21:54:13

使用data.table

代码语言:javascript
运行
复制
require(data.table)
dt <- data.table(data, key="ID")
dt[, list(type=type[1], isDesc=sum(isDesc), 
                  isImage=sum(isImage)), by=ID]

#    ID type isDesc isImage
# 1:  1    1      1       2
# 2:  4    2      1       1
# 3:  6    1      1       1

使用plyr

代码语言:javascript
运行
复制
ddply(data , .(ID), summarise, type=type[1], isDesc=sum(isDesc), isImage=sum(isImage))
#   ID type isDesc isImage
# 1  1    1      1       2
# 2  4    2      1       1
# 3  6    1      1       1

编辑:使用data.table.SDcols,如果你有太多的列需要求和,而其他列只取第一个值,你可以这样做。

代码语言:javascript
运行
复制
dt1 <- dt[, lapply(.SD, sum), by=ID, .SDcols=c(3,4)]
dt2 <- dt[, lapply(.SD, head, 1), by=ID, .SDcols=c(2)]
> dt2[dt1]
#    ID type isDesc isImage
# 1:  1    1      1       2
# 2:  4    2      1       1
# 3:  6    1      1       1

您可以将列名或列号作为参数提供给.SDcols。例如:.SDcols=c("type")也有效。

票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/15434123

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档