2016-04-11 31 views
1

Bazıları NA içeren birden çok sütunda özetliyorum. Toplamı almak içinBirden çok sütunu dplyr ile toplarken NA'yı yok sayma

kullanıyorum ve daha sonra sütunların aritmetik toplamını yazıyorum. Ama sütunlar NA'ya sahip ve onlara sıfır olarak davranmak istiyorum. Bunu rowSums ile çalışmaya başlayabildim (aşağıya bakınız), ancak şimdi mutasyon kullanıyor. Mutate kullanmak, daha okunabilir olmasını sağlar, ancak aynı zamanda sütunları çıkarmamı da sağlayabilir. Örnek aşağıda.

require(dplyr) 
data(iris) 
iris <- tbl_df(iris) 
iris[2,3] <- NA 
iris <- mutate(iris, sum = Sepal.Length + Petal.Length) 

nasıl Petal.Length NA yukarıdaki ifadede sıfır olarak ele alınır sağlarsınız? Ben böyle bir şey yapabilirsiniz rowSums kullanarak biliyorum:

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

ama mutasyon ile bile = diff Sepal.Length kurulumu daha kolaydır - Petal.Length. Bu mutasyonu kullanarak bunu başarmanın önerilen yolu ne olurdu?

Not Talep rowSumsDF referans (tanımlanmamış olan) olduğu ile

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

cevap

2

problemi benzerdir. Bu çalışır: fark için

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

, elbette kullanabilirsiniz negatif: rowSums(cbind(Sepal.Length, -Petal.Length), na.rm = T)

genel çözümü ifelse kullanmaktır veya (veya uygun başka bir şeyi) 0'a eksik değerleri ayarlamak için benzer: ifelse daha fazla verimli

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

coalesce bir uygulama, see examples here olurdu. Bu, önceki bağlantıdan @ krlmlr'nin cevabını kullanır (kod için aşağıya bakın veya kimisc package'u kullanın).

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

veri kümesi genişliğinde, tidyr pakette replace_na orada eksik değerleri değiştirin. krlmlr en 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 
} 
İlgili konular