使用两个标准对R中的数据帧进行子集化,其中一个是正则表达式

时间:2011-12-27 13:21:13

标签: regex r subset

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

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?感谢。

2 个答案:

答案 0 :(得分:6)

尝试使用grepl代替grepgrepl返回逻辑向量(对于x的每个元素是否匹配),可以与逻辑运算符组合。

答案 1 :(得分:6)

尽管逻辑正确,但它无法按预期工作的原因是您使用的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返回一个较短的数字向量,因此在这种情况下会被回收。