【问题标题】:Select groups dependgin on values in two columns in dplyr选择组取决于 dplyr 中两列中的值
【发布时间】:2020-06-16 15:25:05
【问题描述】:

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

Groups COL2 COL3
G1 2 8
G1 3 4
G1 0 3
G2 1 3
G2 9 4
G3 3 89
G3 3 5
G4 1 7
G4 2 3

如果至少有一行满足以下两个条件,我只想选择组:COL2 < 3COL3 > 5。因此在这里我将只选择组G1G4

Groups COL2 COL3
G1 2 8
G1 3 4
G1 0 3
G4 1 7
G4 2 3

我试过了:

df%>%
  group_by(Groups) %>%
  filter(any(COL2 <3) & any(COL3 >5)) %>%

【问题讨论】:

  • 在此示例中,您没有名为 COL1 的列,但如果您将 filter 代码更改为正确的列名称,它看起来会提供所需的输出。
  • 我编辑过,是的,但是放 any 并不意味着它会在列中取任何值?
  • 它将考虑组内的任何值。这就是它排除 G2 和 G3 组的原因
  • 哦,你的意思是要同时满足两个条件的一行,然后再考虑其对应的组?

标签: r filter dplyr


【解决方案1】:

如果您只想选择至少有一行同时满足两个条件的组(而不是在组内至少单独满足一次条件),您可以使用以下方法。

# create vector of groups that satisfy the conditions
ok_groups <- (df %>%
  group_by(Groups) %>%
  filter(COL2 <3 & COL3 >5))$Groups

# filter original dataframe according to ok_groups
df %>% filter(Groups %in% ok_groups)

输出

> ok_groups
# [1] "G1" "G4"

> df %>% filter(Groups %in% ok_groups)
#   Groups COL2 COL3
# 1     G1    2    8
# 2     G1    3    4
# 3     G1    0    3
# 4     G4    1    7
# 5     G4    2    3

编辑

我只是在这里为未来的观众插入一个较短的解决方案

df %>%
  group_by(Groups) %>%
  filter(any(COL2 < 3 & COL3 > 5))
#   Groups COL2 COL3
# 1     G1    2    8
# 2     G1    3    4
# 3     G1    0    3
# 4     G4    1    7
# 5     G4    2    3

【讨论】:

  • 如果我使用 : filter(any(COL2 5)) 会怎样?为了只有一个步骤而不必先过滤组名称
  • 这如你所愿,实际上写起来更短。干得好!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-02-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-05-05
相关资源
最近更新 更多