如何根据 R 中的子组和日期估算数据
How to impute data based on subgroup and date in R
我有一个包含气象信息的数据集。它包括变量:
DATE
:2020 年每小时测量一次
STATION
: 收集信息的气象站代码
CITY
: 站所在城市名称
- 10 个数值变量,如
temperature
、precipitation
、wind speed
等
问题是并不是所有的站都测量相同的变量,所以有很多缺失值。此外,在具有特定传感器的站点中,并非所有日期都被记录,因为传感器可能离线或某些日期不合格。
我想要的(但我不知道如何实现)是:给定一个站中的一些缺失数据,用站中的值的平均值填充缺失值同城的其他车站。
例如,考虑这个最小的代码示例:
df = tibble(
DATE = lubridate::ymd_hm(rep(c('2020-01-01 12:00', '2020-01-02 12:00','2020-01-03 12:00','2020-01-04 12:00','2020-01-05 12:00'), 4)),
STATION = rep(c('A', 'B', 'C', 'D'), each=5),
CITY = rep(c('LONDON', 'PARIS'), each=10),
var = c(NA,NA,NA,4,5,6,7,8,NA,10,NA,NA,13,14,15,16,17,18,19,20)
)
第一个观测值属于 STATION
A 和 CITY LONDON
,但已丢失。但是 STATION
B 也在 LONDON
中,在那一天它的值为 6,所以我希望缺失值可以用 6 来估算。
第 8 行属于 STATION
B 和城市 LONDON
,但已丢失。但是 STATION
那天的 A 的值为 4,所以我希望缺失值可以用 4 来估算。依此类推,预期输出将是:
DATE STATION CITY var
<dttm> <chr> <chr> <dbl>
1 2020-01-01 12:00:00 A LONDON 6
2 2020-01-02 12:00:00 A LONDON 7
3 2020-01-03 12:00:00 A LONDON 8
4 2020-01-04 12:00:00 A LONDON 4
5 2020-01-05 12:00:00 A LONDON 5
6 2020-01-01 12:00:00 B LONDON 6
7 2020-01-02 12:00:00 B LONDON 7
8 2020-01-03 12:00:00 B LONDON 8
9 2020-01-04 12:00:00 B LONDON 4
10 2020-01-05 12:00:00 B LONDON 10
11 2020-01-01 12:00:00 C PARIS 16
12 2020-01-02 12:00:00 C PARIS 17
13 2020-01-03 12:00:00 C PARIS 13
14 2020-01-04 12:00:00 C PARIS 14
15 2020-01-05 12:00:00 C PARIS 15
16 2020-01-01 12:00:00 D PARIS 16
17 2020-01-02 12:00:00 D PARIS 17
18 2020-01-03 12:00:00 D PARIS 18
19 2020-01-04 12:00:00 D PARIS 19
20 2020-01-05 12:00:00 D PARIS 20
请注意,实际上有 5 个不同的城市,每个城市有 4 个不同的站点,每小时进行一次观测。[=25=]
left_join(
df,
df %>% group_by(DATE,CITY) %>% summarize(city_mean = mean(var,na.rm=T)),
by=c("DATE","CITY")
) %>%
mutate(var = if_else(is.na(var), city_mean, var)) %>%
select(!city_mean)
如果您不喜欢连接方法,您也可以这样做:
df %>%
rowwise() %>%
mutate(var=if_else(
is.na(var),
mean(df[df$CITY==CITY & df$DATE==DATE,]$var,na.rm=T),
var))
输出(在任一方法下):
DATE STATION CITY var
<dttm> <chr> <chr> <dbl>
1 2020-01-01 12:00:00 A LONDON 6
2 2020-01-02 12:00:00 A LONDON 7
3 2020-01-03 12:00:00 A LONDON 8
4 2020-01-04 12:00:00 A LONDON 4
5 2020-01-05 12:00:00 A LONDON 5
6 2020-01-01 12:00:00 B LONDON 6
7 2020-01-02 12:00:00 B LONDON 7
8 2020-01-03 12:00:00 B LONDON 8
9 2020-01-04 12:00:00 B LONDON 4
10 2020-01-05 12:00:00 B LONDON 10
11 2020-01-01 12:00:00 C PARIS 16
12 2020-01-02 12:00:00 C PARIS 17
13 2020-01-03 12:00:00 C PARIS 13
14 2020-01-04 12:00:00 C PARIS 14
15 2020-01-05 12:00:00 C PARIS 15
16 2020-01-01 12:00:00 D PARIS 16
17 2020-01-02 12:00:00 D PARIS 17
18 2020-01-03 12:00:00 D PARIS 18
19 2020-01-04 12:00:00 D PARIS 19
20 2020-01-05 12:00:00 D PARIS 20
我有一个包含气象信息的数据集。它包括变量:
DATE
:2020 年每小时测量一次STATION
: 收集信息的气象站代码CITY
: 站所在城市名称- 10 个数值变量,如
temperature
、precipitation
、wind speed
等
问题是并不是所有的站都测量相同的变量,所以有很多缺失值。此外,在具有特定传感器的站点中,并非所有日期都被记录,因为传感器可能离线或某些日期不合格。
我想要的(但我不知道如何实现)是:给定一个站中的一些缺失数据,用站中的值的平均值填充缺失值同城的其他车站。
例如,考虑这个最小的代码示例:
df = tibble(
DATE = lubridate::ymd_hm(rep(c('2020-01-01 12:00', '2020-01-02 12:00','2020-01-03 12:00','2020-01-04 12:00','2020-01-05 12:00'), 4)),
STATION = rep(c('A', 'B', 'C', 'D'), each=5),
CITY = rep(c('LONDON', 'PARIS'), each=10),
var = c(NA,NA,NA,4,5,6,7,8,NA,10,NA,NA,13,14,15,16,17,18,19,20)
)
第一个观测值属于 STATION
A 和 CITY LONDON
,但已丢失。但是 STATION
B 也在 LONDON
中,在那一天它的值为 6,所以我希望缺失值可以用 6 来估算。
第 8 行属于 STATION
B 和城市 LONDON
,但已丢失。但是 STATION
那天的 A 的值为 4,所以我希望缺失值可以用 4 来估算。依此类推,预期输出将是:
DATE STATION CITY var
<dttm> <chr> <chr> <dbl>
1 2020-01-01 12:00:00 A LONDON 6
2 2020-01-02 12:00:00 A LONDON 7
3 2020-01-03 12:00:00 A LONDON 8
4 2020-01-04 12:00:00 A LONDON 4
5 2020-01-05 12:00:00 A LONDON 5
6 2020-01-01 12:00:00 B LONDON 6
7 2020-01-02 12:00:00 B LONDON 7
8 2020-01-03 12:00:00 B LONDON 8
9 2020-01-04 12:00:00 B LONDON 4
10 2020-01-05 12:00:00 B LONDON 10
11 2020-01-01 12:00:00 C PARIS 16
12 2020-01-02 12:00:00 C PARIS 17
13 2020-01-03 12:00:00 C PARIS 13
14 2020-01-04 12:00:00 C PARIS 14
15 2020-01-05 12:00:00 C PARIS 15
16 2020-01-01 12:00:00 D PARIS 16
17 2020-01-02 12:00:00 D PARIS 17
18 2020-01-03 12:00:00 D PARIS 18
19 2020-01-04 12:00:00 D PARIS 19
20 2020-01-05 12:00:00 D PARIS 20
请注意,实际上有 5 个不同的城市,每个城市有 4 个不同的站点,每小时进行一次观测。[=25=]
left_join(
df,
df %>% group_by(DATE,CITY) %>% summarize(city_mean = mean(var,na.rm=T)),
by=c("DATE","CITY")
) %>%
mutate(var = if_else(is.na(var), city_mean, var)) %>%
select(!city_mean)
如果您不喜欢连接方法,您也可以这样做:
df %>%
rowwise() %>%
mutate(var=if_else(
is.na(var),
mean(df[df$CITY==CITY & df$DATE==DATE,]$var,na.rm=T),
var))
输出(在任一方法下):
DATE STATION CITY var
<dttm> <chr> <chr> <dbl>
1 2020-01-01 12:00:00 A LONDON 6
2 2020-01-02 12:00:00 A LONDON 7
3 2020-01-03 12:00:00 A LONDON 8
4 2020-01-04 12:00:00 A LONDON 4
5 2020-01-05 12:00:00 A LONDON 5
6 2020-01-01 12:00:00 B LONDON 6
7 2020-01-02 12:00:00 B LONDON 7
8 2020-01-03 12:00:00 B LONDON 8
9 2020-01-04 12:00:00 B LONDON 4
10 2020-01-05 12:00:00 B LONDON 10
11 2020-01-01 12:00:00 C PARIS 16
12 2020-01-02 12:00:00 C PARIS 17
13 2020-01-03 12:00:00 C PARIS 13
14 2020-01-04 12:00:00 C PARIS 14
15 2020-01-05 12:00:00 C PARIS 15
16 2020-01-01 12:00:00 D PARIS 16
17 2020-01-02 12:00:00 D PARIS 17
18 2020-01-03 12:00:00 D PARIS 18
19 2020-01-04 12:00:00 D PARIS 19
20 2020-01-05 12:00:00 D PARIS 20