簡體   English   中英

使用兩個標准對R中的數據幀進行子集化,其中一個是正則表達式

[英]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_bcol_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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM