【问题标题】:R How to use apply with ifelse function to search for string values over many columns?R如何将apply与ifelse函数一起使用来搜索多列的字符串值?
【发布时间】:2016-05-31 00:09:31
【问题描述】:

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

我想要一个 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% 运行一些条件语句,但我不确定如何。

任何建议都会很棒,谢谢。

【问题讨论】:

    标签: r function if-statement dataframe apply


    【解决方案1】:

    我们可以逐行应用条件。注意:连接到括号的加号强制从逻辑到数字。示例:+(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
    

    【讨论】:

    • 差不多了,谢谢,如果说“C02”在第 4 行出现了两次,但“C09”没有出现,当它应该为零时,你会得到一个 1?另外为了帮助我理解 all 函数,假设第 4 行中的所有值都是“C02”,为什么 mydf$C02all &lt;- apply(mydf[,-1], 1, function(x) +all(x == "C02" )) 在其余行中不等于 1 和零?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-03-29
    • 2013-08-13
    • 2016-10-02
    • 1970-01-01
    相关资源
    最近更新 更多