2016-09-09 13 views
-2

リスト内のデータフレームの複数の列を合計し、(計算)入力列を表示せずに合計のみを表示したい。ここでは例:R:リスト内のデータフレームの複数の列を合計するにはどうすればよいですか?

ls <- list(data.frame(a=1, b=5, c=3, d=2), data.frame(a=NA, b=2, c=7, d=9)) 

ls 
[[1]] 
    a b c d 
1 1 5 3 2 

[[2]] 
    a b c d 
1 NA 2 7 9 

私の予想結果は次のとおりです。

ls2 
[[1]] 
    c new 
1 3 8 

[[2]] 
    c new 
1 7 11 

任意のアイデアはどのようにこれを行うには?これまでは、リストのために、入力列(a、b、d)を省略せずに、このanswerをリストのために改良しようとしました。私はこれまで試したlapply:

lapply(ls, function(x) x$e <- rowSums(x[,c("a", "b", "d")], na.rm=T)) 
and 
ls$e <- lapply(ls, function(x) rowSums(x[,c("a", "b", "d")], na.rm=T)) 

は編集事前に

をありがとう: この例で正常に動作するあなたの答えてくれてありがとうAechとアブドゥを、。しかし、私は> 200列を持って、あなたは残っている列を記述せずに方法を知っていますか?すべての列に名前を付ける代わりに、計算に使用する列を削除する。

EDIT 2: 改善されたコードをお寄せいただきありがとうございます。これはサンプルデータでうまく機能します。しかし、私の真のデータがないように設定して...私は次のエラーを取得:

Error in rowSums(x[, columns_to_sum], na.rm = T) : 
'x' must be an array of at least two dimensions" 

を私のリストは、200個の列と1行で約96の行列があります。しかし、私はエラーの再現可能な例をどのように準備するのか分かりません。何か案は?

+0

あなたの他の質問はこの1つの正確なだまされやすい人です。あなたはSOに重複した質問を投稿することはできません。この質問が十分でない場合は、それを編集し、最小限の再現可能な例を提供し、探しているものを正確に説明する必要があります。 –

答えて

3

lsが関数なので、lsという名前を付けないでください。ここで

lapply(myList, function(x) data.frame(c=x$c, new = rowSums(x[,c("a", "b", "d")], na.rm=T))) 

はあなただけ(編集後)ドロップ列を指定するソリューションです。

dropped <- c("a", "b", "d") 
lapply(myList, function(x) { 
    x$new <- rowSums(x[,dropped], na.rm=T) 
    x[!names(x) %in% dropped] 
    }) 
+0

ありがとう..私の編集を参照してください –

+0

もし私たちがペタンティックであるならば、 'drop'は関数なので、あなたのベクトルに' drop'という名前を付けてはいけません。私は 'ls'がより一般的な機能であり、混乱の原因になる可能性がより高いと同意します。 – Gregor

+0

問題がまだ残っているので、新しい編集を追加します。ありがとう –

2

試してみてください。

lapply(ls, function(x) { 
    x$new <- rowSums(x[,c("a", "b", "d")], na.rm=T) 
    return(x[,c("c","new")]) 
}) 

編集:

あなたは次のように変数に上rowSumsを使用したい列を置くことができます:ここでは

lapply(ls, function(x) { 
    columns_to_sum <- c("a", "b", "d") 
    x$new <- rowSums(x[,columns_to_sum], na.rm=T) 
    return(x[,!colnames(x) %in% columns_to_sum]) 
}) 

columns_to_sumセーブ変数でありますrowSumsを適用する列の名前。

こちらがお役に立てば幸いです。

+0

ありがとう..私の編集を参照 –

+0

私はまだ問題があるので、私は新しい編集を追加..ありがとう –

+0

@ N.Varela 'columns_to_sum'は1つの列にすることはできません。複数の列を含む必要があります。そうしないと、 'rowSums'関数は機能しません。 – Abdou

関連する問題