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
逻辑的值为FAIL
或ifelse
的新列,该逻辑使用所有具有相同前缀的列。如果像上面的示例中那样限制列数,我将如何处理它:
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")
答案 0 :(得分:2)
您可以
y.df$test <- ifelse(rowSums(y.df[, grepl("a_*", names(y.df))]) == 0, "PASS", "FAIL")
贷记到@Gregor。