2017-11-07 3 views
2

これは少しばかげているかもしれませんが、私はこの問題に対処するより良い方法に感謝します。私は一部のカラムだけ、と言うのを合計したいが、私は合計列のすべての要素がNAのときのNAを維持したいと思い、次のすべての要素がNAである場合の操作の結果としてのNA

a <- matrix(1,5,3) 
a[1:2,2] <- NA 
a[1,c(1,3)] <- NA 
a[3:5,2] <- 2 
a[2:5,3] <- 3 
a <- data.frame(a) 
colnames(a) = c("First", "Second", "Third") 

としてデータフレームを持っています。私は1列目と2列目を合計した場合要するに、私は下の2つのオプションのどちらもが、私は

rowSums(a[, c("First", "Second")]) 
rowSums(a[, c("First", "Second")], na.rm=TRUE) 

欲しいものを提供していますが、正の側に私がすることによってこれを解決した

mySum <- c(NA, 1, 3, 3, 3) 

のようなものを取得したいですこれを処理するよりスマートな方法がある場合ので、私は思っていたのにis.naの組み合わせを使用して、すべての

mySum <- rowSums(a[, c("First", "Second")], na.rm=TRUE) 
iNA = apply(a[, c("First", "Second")], 2, is.na) 
iAllNA = apply(iNA, 1, all) 
mySum[iAllNA] = NA 

これは少しぎこちない感じています。すべての行要素がNAをしている場合

答えて

2

行ごとにmargin = 1applyを使用して、我々はNAを返すか、他我々は彼らのsumを返します。

apply(a[c("First", "Second")], 1, function(x) 
          ifelse(all(is.na(x)), NA, sum(x, na.rm = TRUE))) 

#[1] NA 1 3 3 3 
1
mycols = c("First", "Second") 
replace(x = rowSums(a[mycols], na.rm = TRUE), 
     list = rowSums(is.na(a[mycols])) == length(mycols), 
     values = NA) 
#[1] NA 1 3 3 3 
関連する問題