Joh*_*ith 5 r count aggregate-functions
我有一个包含两列的数据框.我想在数据集中添加另外两列,其中包含基于聚合的计数.
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")
Run Code Online (Sandbox Code Playgroud)
我想简单地计算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))))
Run Code Online (Sandbox Code Playgroud)
有人可以帮忙吗?
感谢您的时间
使用data.table你可以做(我已经NA为你的原始数据添加了一个真实的).我也不确定你是否真的在寻找length(unique())或只是length?
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
Run Code Online (Sandbox Code Playgroud)
在devel版本(v> = 1.9.5)中你也可以使用uniqueN函数
说明
这是一个通用的解决方案,可以在任意数量的所需列上工作.您需要做的就是将列名称放入cols.
lapply(.SD, 正在调用指定的列上的某个函数 .SDcols = colspaste0(cols, ".count")添加count到指定的列名称时创建新列名称cols:=通过引用执行赋值,意味着使用就地输出更新新创建的列lapply(.SD, by 参数是指定聚合器列| 归档时间: |
|
| 查看次数: |
128 次 |
| 最近记录: |