[英]Is it possible to simultaneously create many new variables using mutate(), across(), starts_with(), and case_when()?
[英]Create new variable using mutate on logical conditions across many variables - 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條件? 我在這里發現了一個類似的問題但是我想應用一個單一的邏輯比較而不是寫出每一個。 我無法弄清楚如何使用data.table
使后續代碼工作。 任何幫助將不勝感激!
與往常一樣,最佳答案取決於具體問題。
在這種情況下,例如,您可以使用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
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.