Фильтрация data.frame на основе row_number()
UPDATE: 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)
Но я хотел бы понять, почему моя первая попытка не работает.
Ответы
Ответ 1
Функция row_number()
не просто возвращает номер строки каждого элемента и поэтому не может использоваться так, как вы хотите:
• 'row_number: равнозначно' rank (ties.method = "first" )
Вы на самом деле не говорите, чего хотите 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
На самом деле функция dplyr slice
предназначена для такого подмножества:
df %>% slice(2:7)
(Я немного опаздываю на вечеринку, но думал, что добавлю это для будущих читателей)
Ответ 3
Вот еще один способ сделать фильтрацию на основе числа строк в конвейере.
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