2016-07-26 15 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)] 
} 

これはで、エラー結果:

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

私はただの文字を取得する方法がわからない:

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

V1のために、私はtrimmed割り当てがのようになります知っていますその構文に合うように"V1"という値を設定します。

+0

あなたはタイプミスがあります。 '。()'に 'count = sum(colName)'をラップします。これはよくある質問です:https://rawgit.com/wiki/Rdatatable/data.table/vignettes/datatable-faq.html#unused-arguments-mysum-sumv唯一の問題であるかどうかは不明です。 – Frank

+0

それでも私の質問には答えられません。私は同じエラーを取得します。 '文字' '" V1 "'値が ''整えられた ''行で動作するようにするにはどうすればいいですか? – 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要素を数えます。