【问题标题】:Incrementally binning a data frame by a single variable while taking mean across all others通过单个变量对数据框进行增量分箱,同时对所有其他变量取平均值
【发布时间】:2020-07-11 17:18:06
【问题描述】:

我有以下(深度)数据:

set.seed(123)

stn_1 <- data.frame(Station = rep("stn_1", each=30),
                    Depths  = seq(0, 8,  length=30),
                    rand    = rnorm(30, mean=70))

stn_2 <- data.frame(Station = rep("stn_2", each=40),
                    Depths  = seq(0, 10, length=40),
                    rand    = rnorm(40, mean=20))

stn_3 <- data.frame(Station = rep("stn_3", each=18),
                    Depths  = seq(0, 7,  length=18),
                    rand    = rnorm(18, mean=40))

stations <- rbind(stn_1,stn_2,stn_3)

请注意,每个站点的总行数长度不同。

我希望根据从 0 开始的 1 m 增量对数据进行分箱,并通过四舍五入到最大可能整数来完成。

(7.2 = 最多 7 个,7.7 = 最多 8 个)

对于其他变量$rand,必须在由被分箱的行确定的分箱中取平均值。我想对所有车站都这样做,实际上有很多。

stn_1 的所需输出示例如下:

Station  Depth  rand
stn_1    0      68.951155
stn_2    1      69.2910275
stn_3    2      70.7624675
stn_4    3      69.8505
# constructed manually

是的,我已经搜遍了,但找不到一个非常有效的例子。

非常感谢!

(我也有始终一致的字符变量,因此为它们抓取第一行也很方便!)

【问题讨论】:

    标签: r dplyr


    【解决方案1】:

    一个dplyr 选项可以是:

    stations %>%
     mutate(cond = Depths %/% 1,
            Depths = if_else(abs(Depths - cond) > abs(Depths - (cond + 1)),
                              cond + 1,
                              cond)) %>%
     group_by(Station, Depths) %>%
     summarise(rand = mean(rand))
    
       Station Depths  rand
       <fct>    <dbl> <dbl>
     1 stn_1        0  69.6
     2 stn_1        1  70.9
     3 stn_1        2  69.5
     4 stn_1        3  70.7
     5 stn_1        4  70.5
     6 stn_1        5  69.4
     7 stn_1        6  69.2
     8 stn_1        7  69.7
     9 stn_1        8  70.1
    10 stn_2        0  20.1
    

    【讨论】:

    • 非常感谢,也感谢您的编辑,set.seed() 当然!!
    【解决方案2】:

    您可以使用findInterval/cut 来创建此类群组。

    library(dplyr)
    
    stations %>%
      group_by(Station, grp = findInterval(Depths, seq(0, round(max(Depths))))) %>%
      summarise(rand = mean(rand)) 
    

    如果您要保留其他常量列,可以将它们包含在group_by 中。

    【讨论】:

      猜你喜欢
      • 2022-11-10
      • 2011-02-03
      • 2019-08-18
      • 2011-01-31
      • 2019-04-19
      • 1970-01-01
      • 2020-05-24
      • 2019-09-03
      相关资源
      最近更新 更多