【问题标题】:Filter for first 5 observations per group in tidyverse在 tidyverse 中过滤每组的前 5 个观察值
【发布时间】:2020-01-30 17:43:30
【问题描述】:

我有几个不同测量位置的降水数据,我想使用tidyverse 函数仅过滤每个位置和每组降水强度的前 n 个观测值。

到目前为止,我已按位置和降水强度对数据进行了分组。

这是一个最小的例子(每个位置的每个降雨强度都有几个观测值)

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(???)

【问题讨论】:

标签: r filter dplyr tidyverse


【解决方案1】:

data.table 中的一个选项

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

【讨论】:

    【解决方案2】:
    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] 
    

    【讨论】:

      【解决方案3】:

      你可以这样做:

      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
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-07-19
        • 1970-01-01
        • 2018-07-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多