2014-11-21 65 views
3

可以mutate根據跨變量應用的邏輯條件創建新變量嗎?
更具體地說,請考慮以下數據。在多個變量的邏輯條件下使用mutate創建新變量 - mutate?

set.seed(1234) 
val <- c(rep(0, 20), 1) 
a <- sample(val, 50, replace=T) 
b <- sample(val, 50, replace=T) 
c <- sample(val, 50, replace=T) 
d <- sample(val, 50, replace=T) 
dat <- data.frame(a,b,c,d) 

下面是一些僞代碼,使程序在我想這樣做,但本質上刪除所有邏輯比較(因爲我有很多做)什麼。顯然這不是功能性代碼。

new.dat <- mutate(dat, anyABCD == ifelse(A or B or C or D == 1, 1, 0)) 

是否有一個更有效的過程來處理此任務以避免很長的ifelse條件集?我發現了一個類似的問題here,但我想申請一個單一的邏輯比較而不是寫每一個。我無法弄清楚如何使用data.table來完成後續代碼的工作。任何幫助將不勝感激!

回答

3

一如既往,最佳答案將取決於具體問題。

在這種情況下,例如,你可以使用pmax()

dat$anyABCD <- with(dat, pmax(a, b, c, d) == 1) 

head(dat) 
    a b c d anyABCD 
1 0 0 0 0 FALSE 
2 0 0 0 0 FALSE 
3 0 0 0 0 FALSE 
4 0 0 0 0 FALSE 
5 0 0 0 0 FALSE 
6 0 0 0 1 TRUE 

你也可以使用一個apply的功能,例如:

dat$anyABCD <- apply(dat[, 1:4], 1, function(x)max(x) == 1) 
head(dat) 

    a b c d anyABCD 
1 0 0 0 0 FALSE 
2 0 0 0 0 FALSE 
3 0 0 0 0 FALSE 
4 0 0 0 0 FALSE 
5 0 0 0 0 FALSE 
6 0 0 0 1 TRUE 

而且,如果你是相當肯定的數據是二進制的,你可以使用rowSums()

dat$anyABCD <- rowSums(dat[, 1:4] >= 1) 

head(dat) 
    a b c d anyABCD 
1 0 0 0 0  0 
2 0 0 0 0  0 
3 0 0 0 0  0 
4 0 0 0 0  0 
5 0 0 0 0  0 
6 0 0 0 1  1 
+0

完美。額外的例子也特別有用。在這種情況下,mutate並不是最佳解決方案! – 2014-11-21 13:54:15

相關問題