[英]How to apply ifelse function by column names?
我知道周围也有很多类似的问题,但是恐怕无法解决这个特定的问题,尽管显然这很简单!
我正在尝试编写一个简单的ifelse函数,以使用列名 (而不是数字)应用于数据框中的一系列列。 我试图做的是创建一个u_all
变量,如下所示,而无需重复键入列名。
dat <- data.frame(id=c(1:20),u1 = sample(c(0:1),20,replace=T) , u2 = sample(c(0:1),20,replace=T) , u3 = sample(c(0:1),20,replace=T))
dat<-within(dat,u_all<-ifelse (u1==1 | u2==1 |u3==1,1,0))
dat
我尝试了apply
许多变体,但显然我ifelse
了ifelse
因为这些分组函数分别在每个列上复制了ifelse
函数。
dat2 <- data.frame(id=c(1:20),u1 = sample(c(0:1),20,replace=T) , u2 = sample(c(0:1),20,replace=T) , u3 = sample(c(0:1),20,replace=T))
dat2<-cbind(dat2,sapply(dat2[,grepl("^u\\d{1,}",colnames(dat2))],
function(x){ u_all<-ifelse(x==1 & !is.na(x),1,0)}))
dat2
这条线来自OP
dat<-within(dat,u_all<-ifelse (u1==1 | u2==1 |u3==1,1,0))
可以改为
dat$u_all <- +Reduce("|", dat[, c("u1", "u2", "u3")])
就中间对象而言,它是如何工作的:
D = dat[, c("u1", "u2", "u3")]
使用列的名称对数据帧进行子集化。 r = Reduce("|", D)
通过放置|
折叠数据 在每对列之间。 结果是逻辑(TRUE / FALSE)向量。 r
转换为0/1整数向量,可以使用ifelse(r,1L,0L)
或as.integer(r)
(因为TRUE / FALSE默认情况下转换为1/0)或仅一元+
,例如+r
如果您想避免使用列名(从帖子中我真的不清楚),则可以构造D = dat[-1]
来排除第一列。
您快要准备好了,这是一个解决方案,该方法适用于行并使用all将测试向量转换为一个数字。
dat2$u_all <- apply(dat2[,-1], MARGIN=1, FUN=function(x){
any(x==1)&all(!is.na(x))*1
}
)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.