data.table SELECT GROUP BY R中的列索引?

时间:2016-07-26 14:50:30

标签: r data.table

我正在遍历数据框中的列(它也是我代码中的数据表)。在SQL中,相当于我想对每个变量做的事情如下:

SELECT COUNT(VAR) FROM df GROUP BY MonthYear
但是,我在R中做某事时遇到了一些麻烦。我的文件结构很差,所以我有一些dplyr + data.table解决方法,我正在尝试使用。

library(dplyr)
library(data.table)

df <- data.frame(MonthYear = c("JAN15", "JAN15", "FEB15", "MAR15", "MAR15"), V1 = c(1,1,0,0,0), V2 = c(0,1,1,1,0), V3 = c(0,0,0,1,1), V4 = c(0,1,1,1,1))

for(colNum in 2:length(names(df))){
    colName <- names(df)[colNum]
    filtered <- select(df, c(1, colNum))
    filtered_dt <- data.table(filtered, key = "MonthYear")
    trimmed <- filtered_dt[, count = sum(colName), by = key(filtered_dt)]
}

导致错误:

  

sum(列)中的错误:参数

的'type'(字符)无效

对于V1,我知道trimmed分配应如下所示:

trimmed <- filtered_dt[, count = sum(V1), by = key(filtered_dt)]

我只是不知道如何获得"V1"的字符值以适合该语法。

1 个答案:

答案 0 :(得分:3)

问题令人困惑,您在代码中使用SQL count(var),并提供了示例,您似乎想要使用sum(var)。使用count(var)将计算所有非NULL元素,包括重复元素 假设您希望按月sum变量,那么迈克尔评论中的解决方案就是高效而干净的答案:

library(data.table)
df <- data.frame(MonthYear = c("JAN15", "JAN15", "FEB15", "MAR15", "MAR15"), V1 = c(1,1,0,0,0), V2 = c(0,1,1,1,0), V3 = c(0,0,0,1,1), V4 = c(0,1,1,1,1))
setDT(df)
df[ , lapply(.SD, sum), by = MonthYear]
#   MonthYear V1 V2 V3 V4
#1:     JAN15  2  1  0  1
#2:     FEB15  0  1  0  1
#3:     MAR15  0  1  2  2

如果您的示例数据不能很好地解决您的问题并且您真的想要SQL count(var),那么只需使用df[, lapply(.SD, function(x) sum(!is.na(x))), by = MonthYear],这将按组计算非NA元素。