【问题标题】:use dplyr but keep groups present in a least anyway使用 dplyr 但至少保持组存在
【发布时间】:2020-09-08 16:59:29
【问题描述】:

您好,假设我有一个 df,例如:

Groups COL1 
G1 4
G1 32
G1 43
G2 43
G2 23
G2 0
G3 2
G3 4
G4 2
G4 1

我只想保留至少一个 COL1 值 >5 的组

为此我使用:

df %>%
  group_by(Groups) %>%
  filter(any(COL1 >5))

我应该得到:

Groups COL1 
G1 4
G1 32
G1 43
G2 43
G2 23
G2 0

但现在让我们说我想这样做,但我想将组保留在某个列表中:list

如果一个组在该列表中,我仍然保留该组(即使所有值都

Groups COL1 
G1 4
G1 32
G1 43
G2 43
G2 23
G2 0
G4 5
G4 5

我保留了 4,因为它在列表中

【问题讨论】:

  • 你可以简单地做df %>% group_by(Groups) %>% filter(any(COL1 > 5) | Groups %in% lst)
  • 如果我有很多 filter(any()) 行怎么办?每次都要加这个吗?
  • “很多filter(any()) 行”是什么意思?你的意思是你有更多的列(COL2COL3,...)需要传递给filter(),或者你有更多的条件只是COL1?最好针对扩展问题调整您的示例。如果您认为您接受的答案足够好,您可以跳过此评论。

标签: r dplyr


【解决方案1】:

试试这个接近你想要的解决方案。我重新使用了您的代码并使用left_join() 添加了一个新变量Index,以便您可以过滤以获得所需的数据框。代码如下:

library(tidyverse)
#List
listv<-c("G4")
#Code
df %>% left_join(df %>%
  group_by(Groups) %>%
  filter(any(COL1 >5) | Groups %in% listv) %>% mutate(Index=1) %>%
  filter(!duplicated(Groups)) %>% select(-COL1)) %>%
  filter(!is.na(Index)) %>% select(-Index)

输出:

  Groups COL1
1     G1    4
2     G1   32
3     G1   43
4     G2   43
5     G2   23
6     G2    0
7     G4    2
8     G4    1

使用的一些数据:

#Data
df <- structure(list(Groups = c("G1", "G1", "G1", "G2", "G2", "G2", 
"G3", "G3", "G4", "G4"), COL1 = c(4L, 32L, 43L, 43L, 23L, 0L, 
2L, 4L, 5L, 5L)), class = "data.frame", row.names = c(NA, -10L
))

【讨论】:

  • oups我修改了输入表,G4只通过,因为它存在于列表中
  • @chippycentra 我已经为您更新了代码,使其适合您使用的值列表!
猜你喜欢
  • 1970-01-01
  • 2023-03-03
  • 2019-08-26
  • 2019-03-15
  • 2020-05-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多