2017-07-11 9 views
1

データフレームの列のサブセットから値を行間に選択的に追加する必要があります。値は0,1,2,3の整数を取ることができます。2と3の合計ではなく、2と3の数で簡単に測定できます。データフレームの長さが60列で、2列目から11列目のみを見たいとします。これを達成するための優れたコード(片道)は、ほんのわずかです:=sumif(a2:a11,">1")。これは、その範囲内のすべての2と3を追加します。Excelのsumif関数と同等の簡潔なRコード - 特にデータフレーム行に適用されます

過去にaggregate()を使用していましたが、このトピックに関するほとんどの回答は、私が探していることを実際には探していませんでした。私はaggregate()を私のように機能させる方法を見つけることができませんでした。必要です。私はまた、これを行うにはrowSums()を取得しようとすると困惑した。

は最終的に私は次のことを行うことができます実現:

apply(data[,2:11], 1, function(x)sum(2*(x==2), 3*(x==3), na.rm=T)) 

これは、はるかに私はExcelのsumifと同等の私の特定の所望の動作を複製するために見つけた最速かつ最もエレガントな方法です。

誰かがもっと良い方法を持っているなら、私はそれを聞いてうれしいです。

+0

' sum_row_if'との比較を使用して行うだろう方法です: 'sum_row_if(gt(1)、df [、2:11])'開示:私はpaですckageの著者。 –

+0

とても助かりました、グレゴリーに感謝します。 –

答えて

2
#DATA 
set.seed(42) 
df = data.frame(matrix(sample(0:3, 250, replace = TRUE), ncol = 50)) 

あなたはrowSums()

rowSums(df[,2:11] * (df[,2:11] > 1), na.rm = TRUE) 
#[1] 18 13 11 19 11 

expss`パッケージ `からあなたのソリューション

apply(df[,2:11], 1, function(x) sum(2*(x==2), 3*(x==3), na.rm=TRUE)) 
#[1] 18 13 11 19 11 
+1

ああ、それはさらに良いです。基本的には同じアプローチ(論理の立場から)ですが、はるかに単純なコードです。これは素晴らしいです、ありがとう。 –

1

提案:ここ

apply(data[,2:11], 1, function(x) sum(x[x %in% 2:3], na.rm = TRUE)) 
+1

ああ、非常に便利です。 %in%はおそらくデータ作業のための私の好きな演算子です。この使用法を知らなかった。ありがとうございました! –

関連する問題