2016-07-26 129 views
1

我遍历数据框中的列(它也是我的代码后面的数据表)。在SQL中,我想每个变量做等价的样子:data.table在R中SELECT GROUP BY列索引?

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)] 
} 

这导致错:

Error in sum(column) : invalid 'type' (character) of argument

V1,我知道trimmed分配应该是这样的:

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

我只是不知道如何让人物值为"V1"以符合该语法。

+0

你有一个错字。将'count = sum(colName)'包装在'。()'中。这是在常见问题:https://rawgit.com/wiki/Rdatatable/data.table/vignettes/datatable-faq.html#unused-arguments-mysum-sumv不知道这是你唯一的问题。 – Frank

+0

虽然这仍然不能回答我的问题。我犯了同样的错误。如何让'character''“V1”'值在'trimmed'行工作? – blacksite

+0

对不起,我不是故意建议它回答你的问题。 – Frank

回答

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元素。