【问题标题】:filtering data.frame based on row_number()基于 row_number() 过滤 data.frame
【发布时间】:2014-11-17 14:42:54
【问题描述】:

更新:dplyr 自提出此问题以来已更新,现在按 OP 的要求执行

我正在尝试使用dplyrdata.frame 中获取第二到第七行。

我正在这样做:

require(dplyr)
df <- data.frame(id = 1:10, var = runif(10))
df <- df %>% filter(row_number() <= 7, row_number() >= 2)

但这会引发错误。

Error in rank(x, ties.method = "first") : 
  argument "x" is missing, with no default

我知道我很容易做到:

df <- df %>% mutate(rn = row_number()) %>% filter(rn <= 7, rn >= 2)

但我想了解为什么我的第一次尝试不起作用。

【问题讨论】:

  • df %&gt;% filter(row_number() %in% 2:7)
  • 我也可以这样做,但为什么df &lt;- df %&gt;% filter(row_number() &lt;= 7, row_number() &gt;= 2) 错了?
  • 我不知道这背后的真正原因。双重filter 似乎有效。
  • 这是一个错误。请在github.com/hadley/dplyr/issues 上提出问题
  • 我认为有它是有用的,只要清楚,它现在已经过时,这样,寻求帮助的人(像我一样)可以看到这不是问题.为了清楚起见,我编辑了帖子。

标签: r dplyr


【解决方案1】:

其实dplyr的slice函数就是为这种子集制作的:

df %>% slice(2:7)

(我参加聚会有点晚了,但我想我会为以后的读者添加这个)

【讨论】:

【解决方案2】:

row_number() 函数不会简单地返回每个元素的行号,因此不能随意使用:

• ‘row_number’:相当于‘rank(ties.method = "first")’

您实际上并没有说您想要row_number 的内容。在你的情况下:

df %>% filter(row_number(id) <= 7, row_number(id) >= 2)

有效,因为id 已排序,所以row_number(id)1:10。我不知道row_number() 在这种情况下的评估结果是什么,但是当第二次调用dplyr 时已经没有东西可以喂它了,你会得到相当于:

> row_number()
Error in rank(x, ties.method = "first") : 
  argument "x" is missing, with no default

那是你的错误。

无论如何,这不是选择行的方式。

你只需要下标df[2:7,],或者如果你坚持到处都是管道:

> df %>% "["(.,2:7,)
  id        var
2  2 0.52352994
3  3 0.02994982
4  4 0.90074801
5  5 0.68935493
6  6 0.57012344
7  7 0.01489950

【讨论】:

  • row_number() 的目的肯定是返回行号(因此得名!),这种行为是一个错误。 (在你的管道示例中你也不需要.
  • 您愿意解释一下"["(.,2:7,) 语法的工作原理吗?这是一个非常有趣的解决方案。
  • 这就是 R 中几乎所有东西都可以写成函数的方式。试试"+"(1,3)
  • @Konrad 作为替代你可以写,比“[”语法更易读: df %>% .[2:7, ]
  • @Spacedman 是正确的,row_number 确实 not 将行号准确地返回为向量,参见例如datasets::airquality %&gt;% row_number 的输出。如果要将其用作包含行号的索引向量,则必须将其转换为数字向量,如datasets::airquality %&gt;% row_number %&gt;% as.numeric
【解决方案3】:

这是在管道中进行基于行号的过滤的另一种方法。

    df <- data.frame(id = 1:10, var = runif(10))

    df %>% .[2:7,]

    > id     var
      2  2 0.28817
      3  3 0.56672
      4  4 0.96610
      5  5 0.74772
      6  6 0.75091
      7  7 0.05165

【讨论】:

  • 它比slice 慢,但不会丢弃NA(例如df %&gt;% .[c(NA,2,4,7),]),这在某些情况下可能很有用。
猜你喜欢
  • 2016-07-13
  • 2015-09-17
  • 1970-01-01
  • 2015-01-17
  • 2016-11-04
  • 1970-01-01
  • 1970-01-01
  • 2018-10-10
  • 1970-01-01
相关资源
最近更新 更多