【问题标题】:subsetting dataframe in R using two criteria, one of them is regular expression使用两个标准对 R 中的数据框进行子集化,其中之一是正则表达式
【发布时间】:2012-01-28 12:41:50
【问题描述】:

我有一个类似这样的数据集:

col_a col_b    col_c
1     abc_boy  1
2     abc_boy  2
1     abc_girl 1
2     abc_girl 2

我只需要根据col_bcol_c取第一行,然后在col_c中修改valye,大概是这样:

df[grep("_boy$",df[,"col_b"]) & df[,"col_c"]=="1","col_c"] <- "yes"

但是上面的代码不行,因为第一个条件和第二个条件不是来自同一个集合。

我可以通过使用显式循环以一种愚蠢的方式做到这一点,或者做一个“两层”子集,如下所示:

df.a <- df[grep("_boy$",df[,"col_b"]),]              #1
df.b <- df[grep("_boy$",df[,"col_b"],invert=TRUE),]  #2
df.a <- df.a[df.a[,"col_c"]=="1","col_c"] <- "yes"   #3
df.a <- df.a[df.a[,"col_c"]=="2","col_c"] <- "no"    #4
df <- rbind(df.a,df.b)                               #5

但我不想这样做,谁能告诉我如何“合并”#1#3?谢谢。

【问题讨论】:

  • 请给我们样本输出以配合样本输入。目前尚不清楚您要做什么。

标签: regex r subset


【解决方案1】:

尝试grepl 而不是grepgrepl 返回一个逻辑向量(x 的每个元素是否匹配),可以与逻辑运算符组合。

【讨论】:

    【解决方案2】:

    尽管逻辑正确,但它没有按预期工作的原因是您使用的是grep,而您应该使用grepl。试试吧:

    df[ grepl("_boy$", df[,"col_b"]) & df[,"col_c"]=="1", "col_c"] <- "yes"
    
    > df
      col_a    col_b col_c
    1     1  abc_boy   yes
    2     2  abc_boy     2
    3     1 abc_girl     1
    4     2 abc_girl     2
    

    grepl 返回其参数长度的逻辑向量,而 grep 返回较短的数字向量,因此在这种情况下会被回收。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-10-25
      • 1970-01-01
      • 2013-11-07
      • 1970-01-01
      • 2015-05-18
      相关资源
      最近更新 更多