【问题标题】:Using dplyr::filter, how can the output be limited to just first 500 rows?使用 dplyr::filter,如何将输出限制为前 500 行?
【发布时间】:2014-06-20 16:51:34
【问题描述】:

dplyr 是一个很棒的快速库。

使用 %>% 运算符可以实现强大的操作。

在我的第一步中,我需要将输出限制为最多 500 行(用于显示目的)。

我该怎么做?

par<-filter(pc,Child_Concept_GID==as.character(mcode)) %>% select(Parent_Concept_GID)

我需要的是类似的东西

filter(pc,CONDITION,rows=500)

有没有直接的方法或一个很好的解决方法而不使第一步成为一个单独的步骤(在 %>% “流”之外)

【问题讨论】:

  • 你注意到dplyr中的top_n()函数了吗?
  • 如果你想在过滤器中添加一些东西,你可以这样做filter(pc,CONDITION, 1:n() &lt;= 500)
  • @joran 我认为 OP 想要显示前 500 行,而不是前 500 行(具有最大值),所以我认为 top_n() 不会是他想要的。 @OP:如果我错了,请纠正我
  • @beginneR 如果只是为了显示目的,我认为顺序无关紧要,但我肯定是错的。
  • 使用head(500)怎么样?还是我在轻视手头的问题。

标签: r dplyr


【解决方案1】:

有几种方法可以做到这一点。假设您正在管道传输数据(使用 %>%)

  • top_n(tn) 适用于分组数据。如果数据是用arrange()排序的,它不会返回tn行
  • head(500) 取前 500 行(例如可以在arrange() 之后使用)
  • sample_n(size=500) 可用于选择任意500行

如果您正在寻找与 SQL 的 LIMIT 等效的 R,请使用 head()。

【讨论】:

  • FTR,head() 似乎也可以与 dbplyr 后端一起使用以添加 LIMIT 子句(至少在我当前的后端)
  • 请注意,dplyr::sample_n 仅适用于本地表。带有dbconnect 和朋友的管道将无法工作(至少在不先拉下整个原始表的情况下不会)。
【解决方案2】:

我认为您实际上是在这里寻找slice()

filter(pc, condition) %>% slice(1:500) 

这不会对结果进行排名。它只是按位置拉一个切片。在本例中,位置为 1 到 500。

如果这来自关系数据库,head 是更好的选择。

【讨论】:

  • 正是需要的!
【解决方案3】:

为了限制filter的输出,可以在filter之后添加一个函数

top_n()

感谢评论者 joran

解决方案

par<-filter(pc,Child_Concept_GID==as.character(mcode)) %>% top_n(500) %>% select(Parent_Concept_GID)

【讨论】:

  • 请注意,如果您要连接到数据库,这几乎肯定不是您想要的(假设您正在尝试执行相当于 TOP n 或 LIMIT n 的操作)。 top_n() 实际上强制对整个表进行排名操作,如果您的表很大,这将需要很长时间。实际上并没有 LIMIT 的实现,因为这在数据库之间是不一致的(请参阅github.com/hadley/dplyr/issues/1087)。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2023-02-10
  • 2019-09-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-09-13
相关资源
最近更新 更多