【问题标题】:Dplyr top_n returns multiple rowsdplyr top_n 返回多行
【发布时间】:2020-12-26 19:56:09
【问题描述】:

Dplyr 提供了一个函数 top_n(),但是如果值相等,它会返回所有行(多于一个)。我想每组只返回一行。请参阅下面的示例。

df <- data.frame(id1=c(rep("A",3),rep("B",3),rep("C",3)),id2=c(8,8,4,7,7,4,5,5,5))
df %>% group_by(id1) %>% top_n(n=1)

【问题讨论】:

  • top_n 基于哪一列? id1 还是 id2?仅供参考:top_n 已被取代。你应该改用slice_max
  • slice_head你只想要每个组的第一行
  • 您可以对每个组中的值进行排序,然后只取前 n

标签: r dplyr


【解决方案1】:

您可以使用arrangeslice 的组合

df %>% 
  group_by(id1) %>% 
  arrange(desc(id2)) %>% 
  slice(1)

如果您想要 larges 元素,请使用 desc with in 安排,否则将其省略。

显然slice_head 也是您要查找的函数的新名称

df %>% 
  group_by(id1) %>% 
  arrange(desc(id2)) %>% 
  slice_head(id2, n=2)

【讨论】:

  • 我试过这个,现在意识到另一个包 Iranges 覆盖了 slice 函数。感谢您的回答
  • slice_head() 不对数据进行排序。它只是对前 n 行进行子集化。
【解决方案2】:

slice_max()with_ties = FALSE 参数一起使用:

library(dplyr)

df %>%
  group_by(id1) %>%
  slice_max(id2, with_ties = FALSE)

# A tibble: 3 x 2
# Groups:   id1 [3]
  id1     id2
  <chr> <dbl>
1 A         8
2 B         7
3 C         5

【讨论】:

    【解决方案3】:

    如果您不想记住这么多容易更改的{dplyr} 函数名称,我可以推荐{data.table} 包来完成此类任务。另外,它更快。

    require(data.table)
    df <- data.frame(id1=c(rep("A",3),rep("B",3),rep("C",3)),id2=c(8,8,4,7,7,4,5,5,5))
    setDT(df)
    df[ ,
        .(id2_head = head(id2, 1)),
        by = id1 ]
    

    【讨论】:

      猜你喜欢
      • 2018-07-10
      • 2019-06-08
      • 1970-01-01
      • 2020-08-24
      • 1970-01-01
      • 2014-09-19
      • 2017-01-15
      • 1970-01-01
      • 2019-12-05
      相关资源
      最近更新 更多