R - 按小时聚合,最大值为秒

问题描述 投票:1回答:1

我有数据,我想在时间步骤上聚合,另外想要计算该组中另一个值的最大值。

为了聚合,我运行以下代码:

s_stats <- lapply(s_df_array, function(x) {
aggregate(x, by=list(unique.values=x$start), length)
})

s_df_array是一个数据帧表,代码可以很好地计算x $ start中每个值的条目出现次数。在这里你可以看到一些数据:列表中的第一个data.frame:

alb.station alb.start alb.km
alb         2         10
alb         2         67
alb         3         23
alb         3         74
alb         3         3
alb         3         15
alb         4         23
alb         4         52

列表中的第二个data.frame:

alt.station alt.start alt.km
alt         3         25
alt         3         45
alt         4         15
alt         4         10

列表中的第三个data.frame:与第一个和第二个相同的结构,但列名以“ber”开头。这继续在此列表中的44个data.frames

对于新列表中的每个data.frame,结果都应该是这样的:

alb.unique.values alb.station alb.max_km
2                 2           67
3                 4           74
4                 2           52

alt.unique.values alt.station alt.max_km
3                 2           45
4                 2           15

所有44个data.frames等等

编辑:为列表添加了更多示例

r aggregate
1个回答
0
投票

我们可以做的

library(dplyr)
df1 %>% 
   group_by(alb.station, alb.start) %>% 
   summarise(station = n(), max.km = max(alb.km))
# A tibble: 3 x 4
# Groups: alb.station [?]
#    alb.station alb.start station max.km
#   <chr>           <int>   <int>  <dbl>
#1 alb                 2       2   67.0
#2 alb                 3       4   74.0
#3 alb                 4       2   52.0

有关data.frames的列表

map(lst, ~ .x %>%
            group_by(alb.station, alb.start) %>%
            summarise(station = n(), max.km = max(alb.km)))

Update

如果我们有一个嵌套的list元素,要么创建一个递归函数,要么使用if/else

map(lst, ~ if(is.data.frame(.x)) .x %>%
        rename_all(funs(sub("^[^.]*\\.", "", .))) %>% 
        group_by(station, start) %>% 
        summarise(n = n(), max.km = max(km)) else map_df(.x, ~ .x %>%
        rename_all(funs(sub("^[^.]*\\.", "", .))) %>%
        group_by(station, start) %>%
        summarise(n = n(), max.km = max(km))))

data

lst <- list(df1, df2, list(df1, df2))
© www.soinside.com 2019 - 2024. All rights reserved.