在R

时间:2015-05-13 10:09:16

标签: 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")

我想简单地计算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))))

有人可以帮忙吗?

感谢您的时间

2 个答案:

答案 0 :(得分:5)

您可以使用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

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

<强>解释

这是一个通用解决方案,适用于任意数量的所需列。您需要做的就是将列名称放入cols

  1. lapply(.SD,正在.SDcols = cols
  2. 中指定的列上调用某个函数
  3. paste0(cols, ".count")创建新的列名,同时将count添加到cols
  4. 中指定的列名称
  5. :=通过引用执行分配,这意味着,使用lapply(.SD, 的输出更新新创建的列
  6. by参数指定聚合器列

答案 1 :(得分:1)

将空字符串转换为NA后:

library(dplyr)
mutate(df, SMS.Type.count   = sum(!is.na(SMS.Type)),
           Reply.Date.count = sum(!is.na(Reply.Date)))