使用 R 中的 mutate(cross) 计算同一日期的每日平均值



我正在尝试一种曾经在不同集合中单词的代码,以计算行的平均值,如果同一日期持续两行。但是,我遇到了一些问题,代码没有省略行。 有些日期有多个温度,但大多数日子只有一个。 我尝试操作 Date 对象,但没有运气。 这实际上是以前运行良好的代码的复制粘贴。

这是一个例子——

w_avg <- df %>% group_by(DATE) %>% 
mutate(across(c("TMIN","TMAX"), ~mean(.x, na.rm=T)))
##data example below-
structure(list(STATION = c("USW00024233", "USW00024233", "USW00024233", 
"USW00024233", "USC00458773", "USC00458773", "USC00458773", "USC00458773", 
"USC00458773", "USW00024233", "USC00458773", "USC00458773", "USW00024233", 
"USC00458773", "USW00024233", "USC00458773", "USC00458773", "USC00458773", 
"USW00024233", "USW00024233", "USC00458773", "USC00458773", "USW00024233", 
"USC00458773", "USC00458773", "USC00458773", "USC00458773", "USC00458773", 
"USC00458773", "USC00458773", "USC00458773", "USC00458773", "USC00458773", 
"USC00458773", "USW00024233", "USW00024233", "USW00024233", "USW00024233", 
"USC00458773", "USW00024233", "USW00024233", "USC00458773", "USC00458773", 
"USC00458773", "USC00458773", "USW00024233", "USC00458773", "USW00024233", 
"USW00024233", "USC00458773", "USC00458773", "USC00458773", "USC00458773", 
"USW00024233", "USW00024233", "USC00458773", "USC00458773", "USW00024233", 
"USC00458773", "USC00458773", "USC00458773", "USC00458773", "USC00458773", 
"USW00024233", "USC00458773", "USC00458773", "USC00458773", "USW00024233", 
"USW00024233", "USC00458773", "USW00024233", "USC00458773", "USC00458773", 
"USC00458773", "USW00024233", "USW00024233", "USW00024233", "USW00024233", 
"USW00024233", "USW00024233", "USC00458773", "USW00024233", "USC00458773", 
"USW00024233", "USC00458773", "USC00458773", "USW00024233", "USC00458773", 
"USC00458773", "USC00458773", "USW00024233", "USW00024233", "USC00458773", 
"USC00458773", "USC00458773", "USW00024233", "USC00458773", "USW00024233", 
"USC00458773", "USW00024233"), NAME = c("SEATTLE TACOMA AIRPORT, WA US", 
"SEATTLE TACOMA AIRPORT, WA US", "SEATTLE TACOMA AIRPORT, WA US", 
"SEATTLE TACOMA AIRPORT, WA US", "VANCOUVER 4 NNE, WA US", "VANCOUVER 4 NNE, WA US", 
"VANCOUVER 4 NNE, WA US", "VANCOUVER 4 NNE, WA US", "VANCOUVER 4 NNE, WA US", 
"SEATTLE TACOMA AIRPORT, WA US", "VANCOUVER 4 NNE, WA US", "VANCOUVER 4 NNE, WA US", 
"SEATTLE TACOMA AIRPORT, WA US", "VANCOUVER 4 NNE, WA US", "SEATTLE TACOMA AIRPORT, WA US", 
"VANCOUVER 4 NNE, WA US", "VANCOUVER 4 NNE, WA US", "VANCOUVER 4 NNE, WA US", 
"SEATTLE TACOMA AIRPORT, WA US", "SEATTLE TACOMA AIRPORT, WA US", 
"VANCOUVER 4 NNE, WA US", "VANCOUVER 4 NNE, WA US", "SEATTLE TACOMA AIRPORT, WA US", 
"VANCOUVER 4 NNE, WA US", "VANCOUVER 4 NNE, WA US", "VANCOUVER 4 NNE, WA US", 
"VANCOUVER 4 NNE, WA US", "VANCOUVER 4 NNE, WA US", "VANCOUVER 4 NNE, WA US", 
"VANCOUVER 4 NNE, WA US", "VANCOUVER 4 NNE, WA US", "VANCOUVER 4 NNE, WA US", 
"VANCOUVER 4 NNE, WA US", "VANCOUVER 4 NNE, WA US", "SEATTLE TACOMA AIRPORT, WA US", 
"SEATTLE TACOMA AIRPORT, WA US", "SEATTLE TACOMA AIRPORT, WA US", 
"SEATTLE TACOMA AIRPORT, WA US", "VANCOUVER 4 NNE, WA US", "SEATTLE TACOMA AIRPORT, WA US", 
"SEATTLE TACOMA AIRPORT, WA US", "VANCOUVER 4 NNE, WA US", "VANCOUVER 4 NNE, WA US", 
"VANCOUVER 4 NNE, WA US", "VANCOUVER 4 NNE, WA US", "SEATTLE TACOMA AIRPORT, WA US", 
"VANCOUVER 4 NNE, WA US", "SEATTLE TACOMA AIRPORT, WA US", "SEATTLE TACOMA AIRPORT, WA US", 
"VANCOUVER 4 NNE, WA US", "VANCOUVER 4 NNE, WA US", "VANCOUVER 4 NNE, WA US", 
"VANCOUVER 4 NNE, WA US", "SEATTLE TACOMA AIRPORT, WA US", "SEATTLE TACOMA AIRPORT, WA US", 
"VANCOUVER 4 NNE, WA US", "VANCOUVER 4 NNE, WA US", "SEATTLE TACOMA AIRPORT, WA US", 
"VANCOUVER 4 NNE, WA US", "VANCOUVER 4 NNE, WA US", "VANCOUVER 4 NNE, WA US", 
"VANCOUVER 4 NNE, WA US", "VANCOUVER 4 NNE, WA US", "SEATTLE TACOMA AIRPORT, WA US", 
"VANCOUVER 4 NNE, WA US", "VANCOUVER 4 NNE, WA US", "VANCOUVER 4 NNE, WA US", 
"SEATTLE TACOMA AIRPORT, WA US", "SEATTLE TACOMA AIRPORT, WA US", 
"VANCOUVER 4 NNE, WA US", "SEATTLE TACOMA AIRPORT, WA US", "VANCOUVER 4 NNE, WA US", 
"VANCOUVER 4 NNE, WA US", "VANCOUVER 4 NNE, WA US", "SEATTLE TACOMA AIRPORT, WA US", 
"SEATTLE TACOMA AIRPORT, WA US", "SEATTLE TACOMA AIRPORT, WA US", 
"SEATTLE TACOMA AIRPORT, WA US", "SEATTLE TACOMA AIRPORT, WA US", 
"SEATTLE TACOMA AIRPORT, WA US", "VANCOUVER 4 NNE, WA US", "SEATTLE TACOMA AIRPORT, WA US", 
"VANCOUVER 4 NNE, WA US", "SEATTLE TACOMA AIRPORT, WA US", "VANCOUVER 4 NNE, WA US", 
"VANCOUVER 4 NNE, WA US", "SEATTLE TACOMA AIRPORT, WA US", "VANCOUVER 4 NNE, WA US", 
"VANCOUVER 4 NNE, WA US", "VANCOUVER 4 NNE, WA US", "SEATTLE TACOMA AIRPORT, WA US", 
"SEATTLE TACOMA AIRPORT, WA US", "VANCOUVER 4 NNE, WA US", "VANCOUVER 4 NNE, WA US", 
"VANCOUVER 4 NNE, WA US", "SEATTLE TACOMA AIRPORT, WA US", "VANCOUVER 4 NNE, WA US", 
"SEATTLE TACOMA AIRPORT, WA US", "VANCOUVER 4 NNE, WA US", "SEATTLE TACOMA AIRPORT, WA US"
), DATE = structure(c(16788, 16503, 14913, 15230, 17276, 15021, 
18021, 15781, 16502, 16763, 15070, 14978, 16837, 17756, 16275, 
18272, 14909, 16268, 17079, 16670, 16756, 18110, 15322, 16811, 
17497, 17740, 15662, 17999, 17721, 14857, 16529, 16650, 17605, 
17905, 16072, 16163, 15874, 17264, 16640, 16923, 15611, 16363, 
17215, 18017, 17083, 16362, 18237, 16550, 15547, 15330, 16409, 
14828, 17399, 15448, 15123, 16338, 16275, 15217, 16704, 18177, 
18065, 15611, 15514, 15754, 18149, 18086, 15440, 16868, 16183, 
16514, 16115, 14917, 17603, 15123, 16342, 16197, 14847, 16522, 
17036, 17122, 18048, 16015, 18379, 16977, 17654, 17096, 17005, 
18002, 17480, 15810, 15361, 16406, 16330, 15646, 15040, 15930, 
17041, 16673, 18251, 15162), class = "Date"), TMAX = c(8.3, 14.4, 
13.3, 17.8, 12.8, 7.2, 21.7, 7.8, 18.9, 6.7, 11.7, 3.9, 8.9, 
23.3, 20.6, 7.2, 10, 30.6, 18.3, 27.8, 10.6, 30, 4.4, 10, 12.8, 
30.6, 12.2, 14.4, 28.3, 21.1, 8.9, 25, 11.1, 7.8, 10.6, 13.3, 
23.3, 11.1, 25, 30.6, 25, 22.2, 13.3, 19.4, 18.9, 22.2, 8.3, 
13.3, 25.6, 5.6, 5, 25.6, 25, 13.3, 15, 17.8, 18.9, 20.6, 18.9, 
18.3, 25, 27.2, 18.3, 7.8, 18.9, 23.3, 18.3, 11.7, 11.7, 17.2, 
11.7, 21.7, 19.4, 16.7, 16.7, 18.3, 20.6, 15.6, 26.7, 10.6, 25.6, 
12.8, 18.9, 22.2, 22.2, 15.6, 22.8, 10.6, 11.1, 12.8, 6.7, 5.6, 
21.7, 15, 9.4, 27.8, 26.1, 28.3, 12.2, 19.4), TMIN = c(2.8, 4.4, 
8.3, 13.9, 5.6, 0, 5.6, -0.6, -1.7, 2.8, 4.4, NA, 3.9, 12.2, 
12.8, 3.9, 1.7, 12.8, 11.1, 13.9, 2.2, 13.9, 0.6, -3.3, 3.3, 
12.8, 1.1, 5, 12.2, 10.6, 2.2, 14.4, -1.7, 3.3, 6.1, 6.1, 13.3, 
5, 10.6, 12.2, 12.2, 12.8, 5, -0.6, 12.2, 12.8, -1.1, 5.6, 12.8, 
-5.6, 1.7, 12.2, 12.8, 7.2, 10, 12.8, 13.3, 11.1, 2.2, 3.9, 12.8, 
10.6, 11.1, 3.9, 12.2, 11.7, 5, 3.9, 6.1, 2.8, 6.1, 3.3, 2.8, 
7.2, 11.1, 7.2, 12.8, 9.4, 12.2, 5, 10, 7.8, 3.3, 13.3, 5, 8.9, 
14.4, 1.1, 3.9, 0.6, 2.2, -3.2, 11.1, 8.3, -2.8, 15, 9.4, 13.9, 
8.9, 12.2)), row.names = c(NA, -100L), class = c("tbl_df", "tbl", 
"data.frame"))

你应该试试这个:

library(dplyr)
w_avg <- df %>% group_by(DATE) %>% select(4:5) %>%
summarise_all(mean, na.rm = TRUE)

或者,由于您只汇总了 2 列,因此可以直接在summarise()中指定它们,如下所示。

w_avg <- df %>% group_by(DATE) %>%
summarise(avg_tmin = mean(TMIN,na.rm=TRUE),
avg_tmax = mean(TMAX,na.rm=TRUE))
head(w_avg)

。和输出:

> head(w_avg)
# A tibble: 6 x 3
DATE       avg_tmin avg_tmax
<date>        <dbl>    <dbl>
1 2010-08-07     12.2     25.6
2 2010-08-26     12.8     20.6
3 2010-09-05     10.6     21.1
4 2010-10-27      1.7     10  
5 2010-10-31      8.3     13.3
6 2010-11-04      3.3     21.7

如果您使用的是 R 4.0 和dplyr 1.0.0,则可以在summarise()中使用across()

w_avg <- df %>% group_by(DATE) %>%
summarise(across(c(TMIN,TMAX),~mean(.x,na.rm=TRUE)))
head(w_avg)

。和输出:

> head(w_avg)
# A tibble: 6 x 3
DATE        TMIN  TMAX
<date>     <dbl> <dbl>
1 2010-08-07  12.2  25.6
2 2010-08-26  12.8  20.6
3 2010-09-05  10.6  21.1
4 2010-10-27   1.7  10  
5 2010-10-31   8.3  13.3
6 2010-11-04   3.3  21.7

最新更新