R如何使用apply with ifelse函数在多个列上搜索字符串值?

R如何使用apply with ifelse函数在多个列上搜索字符串值?,r,function,if-statement,dataframe,apply,R,Function,If Statement,Dataframe,Apply,我知道有很多类似的问题,但就是想不出来 我需要一个ifelse函数来遍历数据帧中的许多列。我想向数据帧添加两个变量,“仅C03_”和“仅c02_和_c09”。我只关注包含值的条目:“C02”、“C03”、“C09” 示例数据: mydf<- data.frame(id=1:4, x1=c("A02", "C02", "C03", "M01"), x2=c("B02", "", "C02", "C09"),

我知道有很多类似的问题,但就是想不出来

我需要一个
ifelse
函数来遍历数据帧中的许多列。我想向数据帧添加两个变量,“仅C03_”和“仅c02_和_c09”。我只关注包含值的条目:“C02”、“C03”、“C09”

示例数据:

mydf<- data.frame(id=1:4,
                  x1=c("A02", "C02", "C03", "M01"),
                  x2=c("B02", "", "C02", "C09"),
                  x3=c("C03", "C03", "C09", "C02") )

R>mydf
  id  x1  x2  x3
1  1 A02 B02 C03
2  2 C02     C03
3  3 C03 C02 C09
4  4 M01 C09 C02
我第一次试过这样的东西

mydf$C03_only <- with(mydf,ifelse(x1 != "C02" | "C09" & x2 !="C02" | "C09" & x3== "C03",1,0))
这也不起作用,但(只是部分完成)如果玩够了,它可能会起作用

我认为最好的方法是使用
apply
函数,但无法使其工作:

mydf$C03_only<- apply(mydf[,-1], MARGIN=1, FUN=function(x){ 
  ifelse(any(x == "C03") & any(x != "C09" & x != "C02") , 1, 0)
}
)

mydf$only_c02_and_c09<- apply(mydf[,-1], MARGIN=1, FUN=function(x){ 
  ifelse(any(x == "C02" & x == "C09") & any(x != "C03") , 1, 0)
}
)

mydf$C03_仅我们可以使用行应用条件。注意:连接到偏执括号的加号强制从逻辑到数字。示例:
+(x)
与.numeric(x)
相同:


mydf$C03\u差不多了谢谢,如果说第4行中“C02”出现了两次,而“C09”没有出现,那么当它应该为零时,您将得到一个1?另外,为了帮助我理解
all
函数,让我们假设第4行中的所有值都是“C02”,为什么
mydf$C02all
mydf$C03_only<-rep(0,nrow(mydf))
for (i in 2:nrow(mydf)){
  if (mydf$x1[i]!="C02" && mydf$x2[i]!="C09" && mydf$x3[i]=="C03"){
    mydf$C03_only[i]<-1}
}
mydf$C03_only<- apply(mydf[,-1], MARGIN=1, FUN=function(x){ 
  ifelse(any(x == "C03") & any(x != "C09" & x != "C02") , 1, 0)
}
)

mydf$only_c02_and_c09<- apply(mydf[,-1], MARGIN=1, FUN=function(x){ 
  ifelse(any(x == "C02" & x == "C09") & any(x != "C03") , 1, 0)
}
)
mydf$C03_only <- apply(mydf, 1, function(x) +(any(x=="C03") & all(x != "C02" & x != "C09")))
mydf$only_c02_and_c09 <- apply(mydf, 1, function(x) +(!any(x=="C03") & sum(x == "C02" | x == "C09") >= 2L))
mydf
#   id  x1  x2  x3 C03_only only_c02_and_c09
# 1  1 A02 B02 C03        1                0
# 2  2 C02     C03        0                0
# 3  3 C03 C02 C09        0                0
# 4  4 M01 C09 C02        0                1