首页 > 解决方案 > 如何在使用 R 的每个观察中不出现的另一列中基于字符串 grep 组?

问题描述

必须简化先前失败的问题。

我想提取由“id”标识的整个组,这些组在另一个名为“strmatch”的列中包含一个字符串(“inter”或“high”)。该字符串不会出现在组的每个观察中,但如果出现,我想将该组分配给相应的数据框。

数据框

df <- data.frame(id = c("a", "a", "b", "b","c", "c","d","d"),
                 std = c("y", "y","n","n","y","y","n","n"),
                 strmatch = c("alpha","TMB-inter","beta","TMB-high","gamma","delta","epsilon","TMB-inter"))

看起来像这样

id  std strmatch
a   y   alpha
a   y   TMB-inter
b   n   beta
b   n   TMB-high
c   y   gamma
c   y   delta
d   n   epsilon
d   n   TMB-inter

预期结果

dfa

id  std strmatch
a   y   alpha
a   y   TMB-inter
d   n   epsilon
d   n   TMB-inter

东风

id  std strmatch
b   n   beta
b   n   TMB-high

东风

id  std strmatch
c   y   gamma
c   y   delta

我试过的

split(df, grepl("high", df$strmatch))

仅给出两个数据帧,一个包含一行包含“高”的行,另一个包含其余的行。

非常感谢你的帮助。

标签: rdataframegroup-bysubset

解决方案


你也许可以把它分成两部分。首先找出匹配的值"inter|high"并将它们分解为单独的数据帧,然后找到不匹配任何unique_vals.

unique_vals <- unique(grep("inter|high", df$strmatch, value = TRUE))

c(lapply(unique_vals, function(x) subset(df, id %in% id[strmatch == x])), 
         list(subset(df, !id %in% id[strmatch %in% unique_vals])))


#[[1]]
#  id std  strmatch
#1  a   y     alpha
#2  a   y TMB-inter
#7  d   n   epsilon
#8  d   n TMB-inter

#[[2]]
#  id std strmatch
#3  b   n     beta
#4  b   n TMB-high

#[[3]]
#  id std strmatch
#5  c   y    gamma
#6  c   y    delta

推荐阅读