将ifelse逻辑应用于R中具有共享前缀的所有列

问题描述 投票:0回答:1
a<-c("a_1", "a_2", "a_3", "a_4", "b_5", "b", "b_9", "c", "c1", "c_1")
x<-c(0,0,0,1,"a",5,8,0,0,9)
y<-c(0,0,1,0,"b",5,8,0,0,9)
z<-c(0,0,0,0,"c",5,8,0,0,9)
y.df<-as.data.frame(t(data.frame(x,y,z)))
colnames(y.df)<-a
y.df$a_1<-as.numeric(y.df$a_1)
y.df$a_2<-as.numeric(y.df$a_2)
y.df$a_3<-as.numeric(y.df$a_3)
y.df$a_4<-as.numeric(y.df$a_4)
y.df
  a_1 a_2 a_3 a_4 b_5 b b_9 c c1 c_1  
   0   0   0   1  50  5   8 0  0   9   
   0   0   1   0  50  5   8 0  0   9   
   0   0   0   0  50  5   8 0  0   9   

我有一个类似于上面的示例数据的data.frame,在该示例中,我有一系列共有相同后缀的列(除了实际数据,还有更多列-因此需要此问题)。我想要一种对共享前缀的所有列应用相同的ifelse子句的方法,而不必显式写出每个列的名称(因为在我的真实数据中,我有40多个列)。因此,在此示例中,我想要一个基于PASS逻辑的值FAILifelse的新列,该逻辑使用所有具有相同前缀的列。如果像上面的示例一样,列数受到限制,我将如何处理它:

y.df$test<-ifelse(y.df$a_1 == 0 & y.df$a_2 == 0 & y.df$a_3 == 0 & y.df$a_4 == 0, "FAIL", "PASS")
y.df
  a_1 a_2 a_3 a_4 b_5 b b_9 c c1 c_1 test
   0   0   0   1  50  5   8 0  0   9 PASS
   0   0   1   0  50  5   8 0  0   9 PASS
   0   0   0   0  50  5   8 0  0   9 FAIL

我尝试了以下操作,但无济于事:

ifelse("a_" %in% colnames(y.df) == 0, "PASS", "FAIL")
r dataframe if-statement
1个回答
2
投票

您可以做

y.df$test <- ifelse(rowSums(y.df[, grepl("a_*", names(y.df))]) == 0, "PASS", "FAIL")

贷给@Gregor。

© www.soinside.com 2019 - 2024. All rights reserved.