Фильтр для первых 5 наблюдений на группу в Tidyverse - PullRequest
2 голосов
/ 01 октября 2019

У меня есть данные об осадках в нескольких разных точках измерения, и я хотел бы отфильтровать только первые n наблюдений за местоположением и по группе интенсивности осадков с использованием функций tidyverse.

Пока что я сгруппировал данные по местоположению и интенсивности осадков.

Это минимальный пример (есть несколько наблюдений за каждой интенсивностью осадков в каждом месте)

df <- data.frame(location = c(rep(1, 7), rep(2, 7)),
                 rain = c(1:7, 1:7))

   location rain
1         1    1
2         1    2
3         1    3
4         1    4
5         1    5
6         1    6
7         1    7
8         2    1
9         2    2
10        2    3
11        2    4
12        2    5
13        2    6
14        2    7

Я думал, что это будет довольно легко использовать group_by() и filter(), нодо сих пор я не нашел выражения, которое бы возвращало только первые n наблюдений на группу дождей в каждом месте.

 df %>% group_by(rain, location) %>% filter(???)

Ответы [ 3 ]

3 голосов
/ 01 октября 2019

Вы можете сделать:

df %>%
 group_by(location) %>%
 slice(1:5)

   location  rain
      <dbl> <int>
 1        1     1
 2        1     2
 3        1     3
 4        1     4
 5        1     5
 6        2     1
 7        2     2
 8        2     3
 9        2     4
10        2     5
2 голосов
/ 01 октября 2019
library(dplyr)
df %>% 
  group_by(location) %>%
  filter(row_number() %in% 1:5)

Решения без dplyr (которые также переставляют строки)

# Base R
df[unlist(lapply(split(row.names(df), df$location), "[", 1:5)), ]

# data.table
library(data.table)
setDT(df)[, .SD[1:5], by = location] 
0 голосов
/ 01 октября 2019

Опция в data.table

library(data.table)
setDT(df)[, .SD[seq_len(.N) <=5], location]
...