私はすでにコメントに本当に良い答えがあると思いますが、私は将来の参考になるように質問を言い換えるつもりです。合計NA以外の要素だけを集計しますが、すべてのNAがNAを返す場合
私はdata.tableを使用してグループ別に集計しようとしています。問題は、いくつかのグループだけがNAを持っているということです。これらのグループについては、合計がNAを返すようにしたいと思います。しかし、NAとは異なる1つの値を持つ1つのグループがある場合は、非NA値の合計を取得したいと考えています。
A <- data.table(col1= c('A','A','B','B','C','C'),
col2= c(NA,NA,2,3,NA,4))
この引数na.rm = T
を添加せずに、グループCは、それがNAを返すべきときにグループAにna.rm = T
戻り0を付加すること、ただし前記
A[, sum(col2), by = .(col1)]
col1 V1
1: A NA
2: B 5
3: C NA
を返すべきときにNAを返します。 、
ifelse(all(is.na(col2)), NA, sum(col2, na.rm = T)
私はそれを回避するための関数を作成しました:私が一番好きな
A[, sum(col2, na.rm = T), by = .(col1)]
col1 V1
1: A 0
2: B 5
3: C 4
アプローチは、私が書いた以下の機能に似ているコメントで提案sandipan 1であり、私はこれを回避するために、すでに組み込みの方法があるかどうかを確認していない:
sum.na <- function(df){
if (all(is.na(df))){
suma <- NA
}
else {
suma <- sum(df, na.rm = T)
}
return(suma)
}
data.tableを含む例を表示できますか?一般的に... 'DT [!is(na)、sumx:= sum(x)、by = id]'は動作するはずです。 – Frank
'x'がベクトルであれば、これはうまくいくはずです:' ifelse(all(is.na(x))、NA、sum(x、na.rm = TRUE)) ' –
@sandipan Fyi、' anyNA '' any(is.na(x)) 'と等価です。' .. hm、ちょうどここで助けにならないでしょう。 – Frank