2017-01-27 10 views
1

データフレームがあり、各行に対して2番目のセル(2番目のセルから始まる)の合計が必要です。 (また、1の左隣が-2および5の左隣-2)正しい和が0である最初の行のためR、各行の各2番目のセルの条件付き合計

> df 
    a b c d 
1 -2 1 -2 5 
2 1 2 1 6 
3 1 3 -1 7 
4 -2 4 2 8 

a <- c(-2,1,1,-2) 
b <- c(1,2,3,4) 
c <- c(-2,1,-1,2) 
d <- c(5,6,7,8) 
df <- data.frame(a,b,c,d) 

これは与える:ここで例です; 2番目は8です。 3番目は3です。 4回目はもう一度です。

ループなしでやりたいので、とwhich()のように試してみましたが、やり遂げられませんでした。

答えて

2

リサイクルベクトル(c(TRUE, FALSE))を使用してデータセットの1番目、3番目、...などの列を交互にするためにデータセットをサブセット化し、0より大きいかどうかを確認して論理ベクトルに変換します(> 0 )、次に値を交互の列の2番目のサブセットieに掛けます。リサイクルベクトル(c(FALSE, TRUE))を使用して、2列目、4列目など。その考え方は、左の列に0より小さい値がある場合、論理行列では偽になり、もう一方の部分集合に掛けることによって0に強制されます。最後に、予想される出力

rowSums((df[c(TRUE, FALSE)]>0)*df[c(FALSE, TRUE)]) 
#[1] 0 8 3 8 

を取得するためにrowSumsを行うこともseq

rowSums((df[seq(1, ncol(df), by = 2)]>0)*df[seq(2, ncol(df), by = 2)]) 
#[1] 0 8 3 8 

それとも別のオプションMap

Reduce(`+`, Map(`*`, lapply(df[c(TRUE, FALSE)], `>`, 0), df[c(FALSE, TRUE)])) 
#[1] 0 8 3 8 
+0

これは正常に動作してReduceあると交換することができますしかし、私は方法を取得しません。 '*'演算子は何をしていますか? – Joe

+0

@Joe他の論理行列のFALSEの場合、対応する値を0に変換するための乗算の演算子です – akrun

関連する問題