2016-04-11 9 views
1

複数の列にわたって合計しています。私は使用していますdplyrで複数の列を合計するときにNAを無視する

dplyr::mutate 

そして合計を得るために列の算術合計を書き出します。しかし列にはNAがあり、それらをゼロとして扱いたいと思います。私はrowSums(下記参照)で動作させることができましたが、現在はmutateを使用しています。 mutateを使用すると読みやすくなりますが、列を減算することもできます。以下にその例を示します。

上記の式でPetal.LengthのNAをゼロとして扱う方法を教えてください。 - Petal.Lengthを

iris$sum <- rowSums(DF[,c("Sepal.Length","Petal.Length")], na.rm = T) 

しかしのmutateとそれも差分= Sepal.Lengthを設定する方が簡単です:私は私のような何かを行うことができますrowSumsを使用して知っています。 突然変異を使用してこれを達成するための推奨される方法は何でしょうか?

注ポストはあなたのrowSumsに問題が(不定)DFへの参照です

http://stackoverflow.com/questions/28873057/sum-across-multiple-columns-with-dplyr 
http://stackoverflow.com/questions/23255318/subtract-multiple-columns-ignoring-na 

答えて

2

に似ています。これは動作します:違いについては

mutate(iris, sum2 = rowSums(cbind(Sepal.Length, Petal.Length), na.rm = T)) 

を、あなたはもちろん否定を使用することができます。rowSums(cbind(Sepal.Length, -Petal.Length), na.rm = T)

一般解は、0(または任意の他の適切な場合)に欠損値を設定するifelseまたは類似を使用することです。

mutate(iris, sum2 = Sepal.Length + ifelse(is.na(Petal.Length), 0, Petal.Length)) 

ifelseより効率​​3210、see examples hereの実装であろう。これは、前のリンクからの@ krlmlrの答えを使用します(コードの一番下を参照するか、kimisc packageを使用してください)。

mutate(iris, sum2 = Sepal.Length + coalesce.na(Petal.Length, 0)) 

は、データセットワイドは、tidyrパッケージでreplace_naあり、欠損値を置き換えます。 krlmlrのcoalesce.na @


as found here

coalesce.na <- function(x, ...) { 
    x.len <- length(x) 
    ly <- list(...) 
    for (y in ly) { 
    y.len <- length(y) 
    if (y.len == 1) { 
     x[is.na(x)] <- y 
    } else { 
     if (x.len %% y.len != 0) 
     warning('object length is not a multiple of first object length') 
     pos <- which(is.na(x)) 
     x[pos] <- y[(pos - 1) %% y.len + 1] 
    } 
    } 
    x 
} 
関連する問題