2014-09-23 8 views
24

UPDATE: dplyr aktualisiert wurde, da diese Frage gestellt wurde und führt nun als die OPFilterung data.frame basierend auf row_number()

Ich versuche, die zweiten auf die siebte Zeile zu bekommen in einem gesuchten data.frame mit dplyr.

Ich bin dies zu tun:

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

Aber das wirft einen Fehler.

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

ich weiß, ich leicht machen könnte:

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

Aber ich möchte verstehen, warum mein erster Versuch nicht funktioniert.

+6

'df%>% filter (row_number()% in% 2: 7)' – akrun

+0

Ich könnte das auch, aber warum 'df <- df %>% filter (row_number() <= 7, row_number()> = 2)' ist falsch ? –

+0

Ich kenne den wahren Grund nicht. Ein Doppelfilter scheint zu funktionieren. – akrun

Antwort

24

Die row_number() Funktion die Zeilennummer jedes Elements nicht einfach zurückgeben und so kann nicht, wie Sie verwendet werden soll:

• ‚row_number‘: Äquivalent zu ‚Rang (ties.method =‚first‘) '

Sie sagen nicht wirklich, was Sie wollen, die row_number von. In Ihrem Fall:

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

funktioniert, weil id sortiert und so row_number(id) ist 1:10. Ich weiß nicht, was row_number() wertet in diesem Zusammenhang auf, aber wenn ein zweites Mal dplyr genannt hat aus den Dingen, es zu füttern und Sie erhalten die äquivalent:

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

Das ist richtig es Ihr Fehler ist.

Wie auch immer, das ist nicht die Möglichkeit, Zeilen auszuwählen.

Sie müssen lediglich df[2:7,] zu tiefgestellt, oder wenn Sie überall auf Rohren bestehen:

> 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

Der Zweck von 'row_number()' ist definitiv, die Zeilennummer zurückzugeben (daher der Name!) Und dieses Verhalten ist ein Fehler. (Sie brauchen auch nicht '.' in Ihrem Beispiel) – hadley

+0

Hinweis für alle, die' row_number' denken, zeigt den Code 'row_number'. Es tut es nicht. Sie möchten die C++ - Funktion 'row_number_prototype'. – Spacedman

+1

Möchten Sie erklären, wie die '" ["(., 2: 7,)' Syntax funktioniert? Es ist eine wirklich interessante Lösung. – Konrad

7

Hier ist eine andere Art und Weise ist Zeilennummer basierte Filterung in einer Pipeline zu tun.

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

Es ist langsamer als 'slice', aber es fällt nicht' NA' (z 'df%>%. [c (NA, 2,4,7),]') was in einigen Fällen nützlich sein könnte. – Bastien

49

Eigentlich ist dplyr slice Funktion für diese Art von subsetting gemacht wird:

df %>% slice(2:7) 

(Ich bin ein wenig spät, um die Partei, sondern dachte, dass ich dies für zukünftige Leser hinzufügen würde)

+0

danke, das war wirklich hilfreich, da der Fehler für mich erneut aufgetreten ist. Ich fand später heraus, dass dies eine Inkonsistenz mit der Behandlung von Datentabellen durch row_number() ist, siehe: http://stackoverflow.com/questions/23861047/unique-rows-in-dplyr-row-number-from-tbl-dt- inkonsistent-zu-tbl-df – Alex

Verwandte Themen