过滤基于row_number()的data.frame

Dan*_*bel 37 r dplyr

更新:自问这个问题以来,dplyr已经更新,现在按照OP的要求执行

我正尝试获得第二至第七行中data.frame使用dplyr.

我这样做:

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

但这会引发错误.

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

我知道我可以轻松制作:

df <- df %>% mutate(rn = row_number()) %>% filter(rn <= 7, rn >= 2)
Run Code Online (Sandbox Code Playgroud)

但我想明白为什么我的第一次尝试不起作用.

tal*_*lat 78

实际上dplyr的slice功能是针对这种子集化的:

df %>% slice(2:7)
Run Code Online (Sandbox Code Playgroud)

(我有点迟到了,但我想我会为未来的读者添加这个)


Spa*_*man 28

row_number()函数不会简单地返回每个元素的行号,因此无法按您的意愿使用:

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

你实际上并没有说出你想要的东西row_number.在你的情况下:

df %>% filter(row_number(id) <= 7, row_number(id) >= 2)
Run Code Online (Sandbox Code Playgroud)

因为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
Run Code Online (Sandbox Code Playgroud)

那就是你的错误.

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

你只需要下标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
Run Code Online (Sandbox Code Playgroud)

  • `row_number()`的目的肯定是返回行号(因此名称!),这种行为是一个错误.(你的管道示例中也不需要`.`) (12认同)
  • 它就像R中的几乎所有东西都可以写成一个函数.试试"+"(1,3)`. (3认同)
  • @Konrad 作为替代,您可以编写,比“[”语法更具可读性: df %&gt;% .[2:7, ] (2认同)

dab*_*ngh 7

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

    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
Run Code Online (Sandbox Code Playgroud)