r - 如何在使用 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))
仅给出两个数据帧,一个包含一行包含“高”的行,另一个包含其余的行。
非常感谢你的帮助。
解决方案
你也许可以把它分成两部分。首先找出匹配的值"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
推荐阅读
- swift - Laravel Swift 添加 UUID
- javascript - Webpack:抑制来自特定文件的警告
- nlog - NLog 文件目标 - 为 Splunk Forwarder 记录日志文件并避免锁定的最佳性能?
- swift - 如何取消接收器中的合并订阅?
- javascript - 在 JS 数组中创建对象
- powershell - PowerShell Remoting BinaryFormatter 序列化
- angular - 模糊事件函数后如何验证?
- c++ - 可以在循环中使用 C++ STL 的这个函数 queue::size() 影响行为吗
- html - 背景图像不起作用,路径正确
- python - 使用 tkinter 从浏览按钮获取全局变量中的文件路径