2014-09-23 46 views
24

UPDATE:因爲這有人問dplyr已更新,現在執行的OP想過濾data.frame()

我正嘗試獲得第二至第七行的data.frame使用dplyr

I'm這樣做:

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) 

但我想知道爲什麼我第一次嘗試是行不通的。

+6

%df%>%filter(row_number()%in%2:7)' – akrun 2014-09-23 11:59:33

+0

我也可以這樣做,但爲什麼'df <- df %>%filter(row_number()<= 7,row_number()> = 2)'是錯誤的? – 2014-09-23 12:04:16

+0

我不知道背後的真正原因。一個雙「過濾器」似乎工作。 – akrun 2014-09-23 12:05:59

回答

24

row_number()功能不是簡單地返回每個元素的行號,所以不能使用像你想:

•「ROW_NUMBER」:等同於「等級(ties.method =‘第一’) '

你實際上並不是在說你想要什麼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.57
7 7 0.01489950 
+8

'row_number()'的用途肯定是返回行號(因此名稱!),這種行爲是一個錯誤。 (你的管道例子中你也不需要'.') – hadley 2014-09-23 22:52:41

+0

任何人都會注意到'row_number'顯示'row_number'代碼。它沒有。你想要'row_number_prototype' C++函數。 – Spacedman 2014-09-24 07:01:05

+1

您是否願意解釋''[「(。,2:7,)'語法是如何工作的?這真是有趣的解決方案。 – Konrad 2016-08-04 14:49:04

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 
+0

它比'slice'慢,但不會丟失NA。 'df%>%。[c(NA,2,4,7),]'),這在某些情況下可能有用。 – Bastien 2018-01-09 12:53:19

49

其實dplyr的slice功能對這種子集的製作:

df %>% slice(2:7) 

(我有點遲到了,但以爲我想補充這爲未來的讀者)

+0

謝謝,這是真正有用的,因爲錯誤再次發生。後來我發現這與row_number()對待數據表的方式不一致,請參閱:http://stackoverflow.com/questions/23861047/unique-rows-in-dplyr-row-number-from-tbl-dt-不一致對TBL-DF – Alex 2016-06-21 23:10:19