2017-04-07 8 views
1

data.frameにはcharacterの列があり、複数の数値の列にはNAが含まれています。 df$idによってaggregatedfに私が欲しいdata.tableを使用してdata.frameをNAsに集約する

df <- data.frame(id=rep("A",3),v1=c(NA,1,NA),v2=c(2,5,2),v3=c(NA,NA,NA),V4=c(0,0,0),stringsAsFactors=F) 

df$id以来繰り返し、他のすべての列にsumを適用します。ここでは

は、いくつかの例行です。

私はこれでした:

require(data.table) 
setDT(df)[,lapply(.SD, function(x) sum(x,na.rm=T)),by=.(id)] 

と、この取得しています:

id v1 v2 v3 V4 
1: A 1 9 0 0 

だから、列v3df内のすべてのNA年代であり、したがってために問題となる0の値を、取得します私はそのような場合にはNAの値を保持したいと思いますが、他のすべてのケースでは(集計は数値とNAの組み合わせを超えていますが、明らかにNAの場合は、合計はNAになります)。例では(df$v4)と表示されていますが、すべて0の列があるため、をdata.frameNAのものに置き換えることはできません。

言い換えれば、これは私の所望の成果れる:

id v1 v2 v3 V4 
1: A 1 9 NA 0 

任意のアイデアどのようにdata.table.SD凝集を得るためには、これを達成するには?

+1

ない 'data.table'問題なくこれを行うことができます:' '合計(C(NA、NA、NA)、na.rm = TRUE) * – Cath

+2

あなた自身の関数を記述する 'mySum < - function(x)if(すべて(is.na(x)))NA else sum( - )(空のセットの合計がゼロであるため、 x、na.rm = TRUE) ' – jogo

答えて

5
df[,lapply(.SD, function(x) ifelse(all(is.na(x)),NA,sum(x,na.rm=T))),by=.(id)] 
id v1 v2 v3 V4 
1: A 1 9 NA 0 
1

またif/else声明

setDT(df)[, lapply(.SD, function(x) sum(x, na.rm = TRUE)*NA^all(is.na(x))), id] 
# id v1 v2 v3 V4 
#1: A 1 9 NA 0 
関連する問題