【问题标题】:Filter rows based on the dplyr groupby, summarize output根据 dplyr groupby 过滤行,汇总输出
【发布时间】:2016-11-13 18:13:50
【问题描述】:

我有一个包含两列、metro、state 的数据集。我在 dplyr 中给出以下命令,

data %>% group_by(metro, State) %>% summarise(count = n())

我得到以下输出,

metro           State         count 
A                OH            703
A                NJ              3
B                GA           1453
B                CA            456
B                WA            123

我现在想过滤掉数据框中只有最大计数的行,而忽略剩余的行。我需要过滤掉相应的行。过滤掉以下命令的行后的输出应该是,

data %>% group_by(metro, State) %>% summarise(count = n())

   metro           State         count 
    A                OH            703
    B                GA           1453

每个地铁只有一个状态,即具有最大计数和剩余的状态被删除。

以下是我的尝试,

data %>% group_by(metro, State) %>% filter(n() == max(n()))

但这再次给出了与输入相同的数据帧。

有人可以帮我做这件事吗?我的输出应该是每个 Metro 都应该有一个具有最大计数的唯一状态,并且应该删除剩余的状态条目。

谢谢

【问题讨论】:

  • data %>% group_by(metro) %>% filter(count == max(count))
  • @Psidom 这仍然给了我相同的输出,因为当我们按地铁分组时,计数加起来,我们无法过滤掉最大条目。
  • @Psidom 我可以在汇总后过滤掉。我的问题是过滤掉带有相应行的原始数据框。如果以前数据框有 2738 行,我需要它在过滤后才有 2156 行。应删除对应于 (3, 456, 123) 计数的行。
  • 请添加一个可重现的例子。

标签: r dplyr


【解决方案1】:

您需要一个双阶段 groupby,首先 groupby metro 和 state 获取计数,然后 groupby metro 并过滤掉不等于每个 Metro 内最大计数的计数:

data1 <- data %>% group_by(metro, State) %>% mutate(count = n()) %>% 
                  group_by(metro) %>% filter(count == max(count))

nrow(data1)

【讨论】:

  • 我不知道为什么你会得到不同的结果。但这似乎对我有用。这是你需要的吗?
  • 这不是我的问题的要求。我已经在评论中给出了我的解释。我想删除数据框中的相应行。不是汇总行。
  • 我可以在总结后过滤掉。我的问题是用相应的行过滤掉原始数据框。如果以前数据框有 2738 行,我需要它在过滤后才有 2156 行。应删除对应于 (3, 456, 123) 计数的行。
  • 这不是只给我计数吗?我的问题是我想用行数过滤整个原始数据框。不算数。
  • 我认为您应该先尝试答案。它仍然会为您提供整个数据框,只需过滤掉几行。
【解决方案2】:

我们也可以使用data.table

library(data.table)
setDT(data)[,  count := .N , .(metro, state)][,  .SD[count == max(count)] , .(metro)]

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2023-02-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-03-06
    • 2021-07-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多