我有一个包含每日温度数据的数据框。我想计算第二个数据帧中两个日期之间的平均值,并将结果添加到新列中。 平均温度必须在数据框 B 行中的日期之间计算。 例子: 2021年2月15日至2021年2月18日期间平均气温 2021年2月18日至2021年2月23日期间的平均气温...
## Daily temperature data frame
date <- as.Date(c('02-15-2021', '02-16-2021', '02-17-2021', '02-18-2021',
'02-19-2021', '02-20-2021', '02-21-2021', '02-22-2021',
'02-23-2021', '02-24-2021', '02-25-2021', '02-26-2021',
'02-27-2021', '02-28-2021', '02-29-2021'), "%m-%d-%Y")
temp <- c(26, 27, 28, 30, 32, 27, 28, 29, 27, 26, 28, 29, 28, 25, 26)
A <- data.frame(date, temp)
head(A)
date2 <- as.Date(c('02-15-2021', '02-18-2021', '02-23-2021',
'02-27-2021', '02-29-2021'), "%m-%d-%Y")
## Data frame with dates for average with the interval between dates to calculate
## the average temperature (the average between the #dates in the lines)
B <- as.data.frame(date2)
head(B)
这是一种解决方案。
也许不是更快(就像某些表合并一样),但可以工作并且不使用外部包。
PD:更改为“02-29-2021”,因为它不是闰年。
#Daily temperature data frame
A <- data.frame(
date = as.Date(c('02-15-2021', '02-16-2021', '02-17-2021', '02-18-2021', '02-19-2021', '02-20-2021', '02-21-2021',
'02-22-2021','02-23-2021','02-24-2021','02-25-2021','02-26-2021',
'02-27-2021','02-28-2021','03-01-2021'), "%m-%d-%Y"),
temp = c(26,27,28,30,32,27,28,29,27,26,28,29,28,25,26))
B <- data.frame(
date2 = as.Date(c('02-15-2021', '02-18-2021', '02-23-2021',
'02-27-2021','02-28-2021'), "%m-%d-%Y"))
# starts here
B$from <- B$date2
B$to <- c(B$date2[-1], Inf)
B$avg_temp <-
tapply(B, seq(nrow(B)),
function(x) {
mean(A[A$date >= x$from & A$date < x$to,]$temp)})
B
#> date2 from to avg_temp
#> 1 2021-02-15 2021-02-15 2021-02-18 27.0
#> 2 2021-02-18 2021-02-18 2021-02-23 29.2
#> 3 2021-02-23 2021-02-23 2021-02-27 27.5
#> 4 2021-02-27 2021-02-27 2021-02-28 28.0
#> 5 2021-02-28 2021-02-28 Inf 25.5
一个简单的方法可能是
> transform(A, ave_temp=ave(temp, cut(date, B$date2), FUN=mean))
date temp ave_temp
1 2021-02-15 26 27.0
2 2021-02-16 27 27.0
3 2021-02-17 28 27.0
4 2021-02-18 30 29.2
5 2021-02-19 32 29.2
6 2021-02-20 27 29.2
7 2021-02-21 28 29.2
8 2021-02-22 29 29.2
9 2021-02-23 27 27.5
10 2021-02-24 26 27.5
11 2021-02-25 28 27.5
12 2021-02-26 29 27.5
13 2021-02-27 28 28.0
14 2021-02-28 25 25.0
15 <NA> 26 26.0
请注意,每个日期仅包含一次。另外,
'02-29-2021'
不存在,所以我们得到NA
。