我有一个类似这样的数据集:
col_a col_b col_c
1 abc_boy 1
2 abc_boy 2
1 abc_girl 1
2 abc_girl 2
我只需要根据col_b
和col_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
?感谢。
答案 0 :(得分:6)
尝试使用grepl
代替grep
。
grepl
返回逻辑向量(对于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
返回一个较短的数字向量,因此在这种情况下会被回收。