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

lok*_*art 4 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
Run Code Online (Sandbox Code Playgroud)

我只需要根据col_b和获取第一行col_c,然后更改valye col_c,这是这样的:

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
Run Code Online (Sandbox Code Playgroud)

但我不愿意,任何人都可以启发我如何"合并" #1#3?谢谢.

rcs*_*rcs 6

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


42-*_*42- 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
Run Code Online (Sandbox Code Playgroud)

grepl重新构造其参数长度的逻辑向量,而grep返回一个较短的数字向量,因此在这种情况下被回收.