更新:自问这个问题以来,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)
但这会引发错误。
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)
但我想了解为什么我的第一次尝试不起作用。
答案 0 :(得分:72)
实际上dplyr的slice
函数是针对这种子集化的:
df %>% slice(2:7)
(我在聚会上有点迟,但我想我会为未来的读者添加这个)
答案 1 :(得分:28)
row_number()
函数不会简单地返回每个元素的行号,因此无法按照您的意愿使用:
•'row_number':相当于'rank(ties.method =&#34; first&#34;)'
你实际上并没有说出你想要的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
答案 2 :(得分: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