我有一个像这样的数据集:
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?谢谢.
尽管逻辑正确,但它没有按预期工作的原因是你正在使用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返回一个较短的数字向量,因此在这种情况下被回收.