sheet - filtrando data.frame basado en row_number()
tidyr r (3)
ACTUALIZACIÓN: dplyr se ha actualizado desde que se hizo esta pregunta y ahora funciona como el OP quería
Estoy tratando de obtener la segunda a la séptima línea en un data.frame
usando dplyr
.
Estoy haciendo esto:
require(dplyr)
df <- data.frame(id = 1:10, var = runif(10))
df <- df %>% filter(row_number() <= 7, row_number() >= 2)
Pero esto arroja un error.
Error in rank(x, ties.method = "first") :
argument "x" is missing, with no default
Sé que podría hacer fácilmente:
df <- df %>% mutate(rn = row_number()) %>% filter(rn <= 7, rn >= 2)
Pero me gustaría entender por qué mi primer intento no funciona.
Aquí hay otra forma de hacer el filtrado basado en el número de fila en una tubería.
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
En realidad, la función de división de dplyr está hecha para este tipo de subconjunto:
df %>% slice(2:7)
(Llego un poco tarde a la fiesta, pero pensé que agregaría esto para futuros lectores)
La función row_number()
no devuelve simplemente el número de fila de cada elemento y, por lo tanto, no se puede utilizar como desee:
• ''row_number'': equivalente a ''rank (ties.method = "first")''
En realidad, no está diciendo lo que quiere el row_number
de row_number
. En tu caso:
df %>% filter(row_number(id) <= 7, row_number(id) >= 2)
funciona porque id
está ordenado, por lo que row_number(id)
es 1:10
. No sé qué row_number()
evalúa en este contexto, pero cuando se llama por segunda vez, a dplyr
han acabado las cosas para alimentarlo y obtienes el equivalente de:
> row_number()
Error in rank(x, ties.method = "first") :
argument "x" is missing, with no default
Ese es tu error allí mismo.
De todos modos, esa no es la forma de seleccionar filas.
Simplemente necesita subíndicar df[2:7,]
, o si insiste en tuberías en todas partes:
> 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