如何根据其他列中的条件从某个 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 中选择所有值?的主要内容,如果未能解决你的问题,请参考以下文章

如何根据列中的某个值为 ag 网格中的整行提供背景颜色?

如何根据条件从每列中获取唯一值?

如何根据列中的值自动填充谷歌表格中的数据

MySQL - 如何根据另一列中的唯一值转置一列中的单元格?

如何根据熊猫中其他列的条件创建新列

Pyspark:如何根据另一列中的匹配值从数组中的第一次出现中选择直到最后的值