R 如何使用 ifelse 函数在多列中搜索字符串值?
R How to use apply with ifelse function to search for string values over many columns?
我知道有很多类似的问题,但就是想不通。
我想要一个 ifelse
函数遍历数据框中的许多列。我想向数据框添加两个变量,"C03_only" 和 "only_c02_and_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
新数据集应如下所示:
R>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
我第一次尝试这样的事情
mydf$C03_only <- with(mydf,ifelse(x1 != "C02" | "C09" & x2 !="C02" | "C09" & x3== "C03",1,0))
这没有用,但这个想法很糟糕,因为我有很多专栏,所以是一个没有 运行 的人。同样,我厌倦了 for loop
:
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}
}
这也没有用,但是(只完成了一部分)如果玩得够多,它可能会。
我认为最好的方法是使用 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)
}
)
这些很接近,但没有雪茄。我需要用一些东西替换 any
但不确定是什么。也许将感兴趣的变量传递给向量和 运行 一些使用 %in%
的条件语句,但我不确定如何。
任何建议都很好,谢谢。
我们可以按行应用条件。注意:连接到括号的加号强制从逻辑到数字。示例:+(x)
等同于 as.numeric(x)
:
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
我知道有很多类似的问题,但就是想不通。
我想要一个 ifelse
函数遍历数据框中的许多列。我想向数据框添加两个变量,"C03_only" 和 "only_c02_and_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
新数据集应如下所示:
R>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
我第一次尝试这样的事情
mydf$C03_only <- with(mydf,ifelse(x1 != "C02" | "C09" & x2 !="C02" | "C09" & x3== "C03",1,0))
这没有用,但这个想法很糟糕,因为我有很多专栏,所以是一个没有 运行 的人。同样,我厌倦了 for loop
:
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}
}
这也没有用,但是(只完成了一部分)如果玩得够多,它可能会。
我认为最好的方法是使用 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)
}
)
这些很接近,但没有雪茄。我需要用一些东西替换 any
但不确定是什么。也许将感兴趣的变量传递给向量和 运行 一些使用 %in%
的条件语句,但我不确定如何。
任何建议都很好,谢谢。
我们可以按行应用条件。注意:连接到括号的加号强制从逻辑到数字。示例:+(x)
等同于 as.numeric(x)
:
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