如何根据其他列中的条件从某个 ID 中选择所有值?
Posted
技术标签:
【中文标题】如何根据其他列中的条件从某个 ID 中选择所有值?【英文标题】:How to select all values from some ID based on condition in other column? 【发布时间】:2022-01-17 22:10:51 【问题描述】:我得到了一个示例中的数据框,当满足条件时,我将选择所有值、所有 ID 以及来自该 ID 的所有值。在这种情况下,条件是路径必须包含"one"
。
df <- data.frame(id=c(1, 1, 1, 2, 2, 2, 3, 3, 3),
path=c("one", "two", "three", "four", "oned", "five", "six",
"seven", "eight"))
预期结果:
result <- data.frame(id=c(1, 1, 1, 2, 2, 2),
path=c("one", "two", "three", "four", "oned", "five"))
这样做最优雅的方式是什么?
【问题讨论】:
【参考方案1】:这可能不是最优雅的方式,但这是我的方法:
my_df <- data.frame(id = c(1,1,1,2,2,2,3,3,3),
path = c("one","two","three", "four", "oned", "five","six", "seven", "eight"))
my_value <- my_df %>% group_by(id) %>% mutate(Test = grepl(pattern = "one", x = path)) %>% filter(Test == TRUE)
my_var <- which(my_df$id %in% my_value$id)
if (length(my_var))
my_df <- my_df[my_var,]
【讨论】:
【参考方案2】:在ave
中使用grepl
。
df[with(df, as.logical(ave(path, id, FUN=\(x) any(grepl('one', x))))), ]
# id path
# 1 1 one
# 2 1 two
# 3 1 three
# 4 2 four
# 5 2 oned
# 6 2 five
数据:
df <- structure(list(id = c(1, 1, 1, 2, 2, 2, 3, 3, 3), path = c("one",
"two", "three", "four", "oned", "five", "six", "seven", "eight"
)), class = "data.frame", row.names = c(NA, -9L))
【讨论】:
【参考方案3】:一行代码可以是这样的:
result <- df[df$id %in% df[grepl('one',df$path),"id"],]
它只是结合了原生 [ ] 运算符和 grepl function。
【讨论】:
【参考方案4】:我们可以为此使用 dplyr。只需group_by
ID,然后使用any(str_detect('one'))
过滤组:
library(dplyr)
library(stringr)
df %>% group_by(ID) %>%
filter(any(str_detect(path, 'one')))
【讨论】:
以上是关于如何根据其他列中的条件从某个 ID 中选择所有值?的主要内容,如果未能解决你的问题,请参考以下文章