[英]subsetting dataframe in R using two criteria, one of them is regular expression
我有一個像這樣的數據集:
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中的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
但我不願意,任何人都可以告訴我如何“合並” #1
和#3
? 謝謝。
嘗試grepl
而不是grep
。 grepl
返回一個邏輯向量(匹配或不匹配x的每個元素),它可以與邏輯運算符組合。
盡管正確的邏輯,它沒有像你期望的那樣工作的原因是你正在使用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
返回一個較短的數字向量,因此在這種情況下會被回收。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.