2016-11-25 5 views
1

合計したいdata.tableにsomデータがあります。簡単な例を以下に示します。私は(可変)n列(char)といくつかのグループ変数から始めます。r data.table - n個の列から要約された列を作成するための文字列を使用

これは私の例ではnsk-varsを数値/整数に変換することができます。私は列の文字列を使用して、これらの合計(nsk1-nsk3)とNAを処理する新しい列を作成したいと考えています。どのように私はこれを共鳴することができますか?

library(data.table) 

x <- data.table(a = c("GrpA", "GrpB"), 
       nsk1 = c("1","3"), 
       nsk2 = c(NA,"1"), 
       nsk3 = c("3", "4")) 

ClNamesStr <- colnames(x) 
ClNamesStr <- ClNamesStr[grepl("^nsk", ClNamesStr)] 

nskStrSum <- paste(ClNamesStr, collapse = "),as.numeric(") 
nskStrSum <- paste("as.numeric(", nskStrSum, "), na.rm = TRUE") 

これは私が働きたい部分です。

x[, nsk0 := sum(eval(nskStrSum)), by = a] 

所望の出力は、これを次のようになります。

a nsk1 nsk2 nsk3 nsk0 
GrpA 1 NA 3 4 
GrpB 3 1 4 8 
+0

THXの@lmoで 'NA' を交換した後Reduceで試すことができます - 私はシンプルに自分の例を作ったかもしれません実現します。私はグループ変数ではありませんが、要約してはいけない他の列を持っています。 ofc、私はちょうど一緒にグループ化することもできますか? – ErrantBard

+0

行ごとに1組の変数を合計しようとしていますか?質問に希望の出力を含めてください。 – lmo

+0

絶対に - 私はそれをプレーンテキストで書いても動作しますが、抽出されたcolnamesから和文の文字列を生成する必要があり、それは動作しない部分です – ErrantBard

答えて

1

はここに行くための一つの方法です。 、選択された変数を介し

x 
     a nsk1 nsk2 nsk3 othr nsk0 
1: GrpA 1 NA 3 a 4 
2: GrpA 3 1 4 b 8 

sapplyランを返す数値にそれぞれ変換し、行列を返し

x[, nsk0 := rowSums(sapply(.SD, function(i) as.numeric(i)), na.rm=TRUE), 
    .SDcols=grep("^nsk", names(x)), by = a] 

。この行列はrowSumsに渡され、各行の値を合計し、NAを無視します。 .SDは、data.table(「by」に含まれる変数を除く)を選択する省略形です。しかし、.SDcolsgrepを使用して変数を選択します。

いくつかのデータタブラは、データの一部をマトリックスに変換するため、この解決策に満足できない場合があります。ただし、この変換が必要な場合があります。

私はそれが機能することを示すために追加の "迷惑"変数を追加しました。

データ

x <- data.table(a = c("GrpA", "GrpA"), 
       nsk1 = c("1","3"), 
       nsk2 = c(NA,"1"), 
       nsk3 = c("3", "4"), 
       othr = letters[1:2]) 
+0

とても素敵です。 +1 – ErrantBard

+0

編集用のThx。私はあなたがそこで何をしたのか推測しましたが、grepで.SDcolsを使用することを考えていませんでした。 – ErrantBard

1

は、我々は0

i1 <- grep("nsk", names(x)) 
x[, nsk0 := Reduce(`+`, lapply(.SD, function(x) 
     as.numeric(replace(x, is.na(x), 0)))), .SDcols = i1] 
x 
#  a nsk1 nsk2 nsk3 othr nsk0 
#1: GrpA 1 NA 3 a 4 
#2: GrpA 3 1 4 b 8 
関連する問題