2016-07-26 78 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元素。