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
使后续代码工作。任何帮助将不胜感激!
答案 0 :(得分: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