繁体   English   中英

如何通过列名应用ifelse函数?

[英]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许多变体,但显然我ifelseifelse因为这些分组函数分别在每个列上复制了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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM