每日数据框中两个日期之间的平均值和总和

问题描述 投票:0回答:2

我有一个包含每日温度数据的数据框。我想计算第二个数据帧中两个日期之间的平均值,并将结果添加到新列中。 平均温度必须在数据框 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)
r dataframe date temperature
2个回答
0
投票

这是一种解决方案。

也许不是更快(就像某些表合并一样),但可以工作并且不使用外部包。

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

0
投票

一个简单的方法可能是

> 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

© www.soinside.com 2019 - 2024. All rights reserved.