加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

在R中聚合

发布时间:2020-12-14 04:57:02 所属栏目:百科 来源:网络整理
导读:我有一个包含两列的数据框.我想在数据集中添加另外两列,其中包含基于聚合的计数. df - structure(list(ID = c(1045937900,1045937900),SMS.Type = c("DF1","WCB14"),SMS.Date = c("12/02/2015 19:51","13/02/2015 08:38"),Reply.Date = c("","13/02/2015 09:
我有一个包含两列的数据框.我想在数据集中添加另外两列,其中包含基于聚合的计数.

df <- structure(list(ID = c(1045937900,1045937900),SMS.Type = c("DF1","WCB14"),SMS.Date = c("12/02/2015 19:51","13/02/2015 08:38"),Reply.Date = c("","13/02/2015 09:52")
),row.names = 4286:4287,class = "data.frame")

我想简单地计算SMS.Type和Reply.Date的实例数,其中没有null.所以在下面的玩具示例中,我将为SMS.Type生成2,为Reply.Date生成1

然后我想将它作为总计数添加到数据框中(我知道它们将复制出原始数据集中的行数但是没关系)

我一直在玩聚合和计数功能,但无济于事

mytempdf <-aggregate(cbind(testtrain$SMS.Type,testtrain$Response.option)~testtrain$ID,train,function(x) length(unique(which(!is.na(x)))))

mytempdf <- aggregate(testtrain$Reply.Date~testtrain$ID,testtrain,function(x) length(which(!is.na(x))))

有人可以帮忙吗?

感谢您的时间

解决方法

使用data.table你可以做(??我已经为你的原始数据添加了一个真正的NA).
我也不确定你是否真的在寻找长度(独特())或长度?

library(data.table)
cols <- c("SMS.Type","Reply.Date")
setDT(df)[,paste0(cols,".count") := 
                  lapply(.SD,function(x) length(unique(na.omit(x)))),.SDcols = cols,by = ID]
#            ID SMS.Type         SMS.Date       Reply.Date SMS.Type.count Reply.Date.count
# 1: 1045937900      DF1 12/02/2015 19:51               NA              2                1
# 2: 1045937900    WCB14 13/02/2015 08:38 13/02/2015 09:52              2                1

在devel版本(v> = 1.9.5)中,您还可以使用uniqueN函数

说明

这是一个通用的解决方案,可以在任意数量的所需列上工作.您需要做的就是将列名称放入cols中.

> lapply(.SD,在.SDcols = cols中指定的列上调用某个函数> paste0(cols,“.count”)创建新的列名,同时将计数添加到cols中指定的列名>:=通过引用执行赋值,意思是使用lapply(.SD)的输出更新新创建的列> by参数指定聚合器列

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读