Подтвердить что ты не робот

Фильтрация 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)

Но я хотел бы понять, почему моя первая попытка не работает.

4b9b3361

Ответ 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