R按组插值
R Interpolate values by group
我有一个欧洲国家的数据框,每个国家出现 10 次(10 天)。
我想插入多列的 NA 值,我可以使用
来实现
library("imputeTS")
na_interpolation(dataframe)
但我想按州内插所有 NA 值。那怎么办?
我已经尝试了很多不同的解决方案,但 none 对我有用。
作为伪代码,我想要类似的东西
na_interpolation(dataframe, groupby=state)
有什么有用的吗?
不幸的是,这些代码示例对我不起作用
interpolation <- dataframe %>%
group_by(state-name) %>%
na_interpolation(dataframe)
您可以使用 split-apply-bind
方法:
do.call(rbind, lapply(split(dataframe, dataframe$state), na_interpolation))
作为一个有效的例子,采用以下虚拟数据:
set.seed(3)
dataframe <- data.frame(state = rep(c("A", "B", "C"), each = 5),
value = rnorm(15))
dataframe$value[sample(15, 4)] <- NA
dataframe
#> state value
#> 1 A -0.96193342
#> 2 A NA
#> 3 A 0.25878822
#> 4 A -1.15213189
#> 5 A 0.19578283
#> 6 B 0.03012394
#> 7 B 0.08541773
#> 8 B NA
#> 9 B NA
#> 10 B 1.26736872
#> 11 C -0.74478160
#> 12 C NA
#> 13 C -0.71635849
#> 14 C 0.25265237
#> 15 C 0.15204571
那么我们可以这样做:
library(imputeTS)
do.call(rbind, lapply(split(dataframe, dataframe$state), na_interpolation))
#> state value
#> A.1 A -0.96193342
#> A.2 A -0.35157260
#> A.3 A 0.25878822
#> A.4 A -1.15213189
#> A.5 A 0.19578283
#> B.6 B 0.03012394
#> B.7 B 0.08541773
#> B.8 B 0.47940140
#> B.9 B 0.87338506
#> B.10 B 1.26736872
#> C.11 C -0.74478160
#> C.12 C -0.73057004
#> C.13 C -0.71635849
#> C.14 C 0.25265237
#> C.15 C 0.15204571
由 reprex package (v0.3.0)
于 2020-12-12 创建
您应该可以按组申请 na_interpolation
。尝试:
library(dplyr)
interpolation <- dataframe %>%
group_by(state) %>%
mutate(value = imputeTS::na_interpolation(value))
选项data.table
library(data.table)
setDT(dataframe)[, value := imputeTS::na_interpolation(value), state]
我有一个欧洲国家的数据框,每个国家出现 10 次(10 天)。 我想插入多列的 NA 值,我可以使用
来实现library("imputeTS")
na_interpolation(dataframe)
但我想按州内插所有 NA 值。那怎么办? 我已经尝试了很多不同的解决方案,但 none 对我有用。
作为伪代码,我想要类似的东西
na_interpolation(dataframe, groupby=state)
有什么有用的吗?
不幸的是,这些代码示例对我不起作用
interpolation <- dataframe %>%
group_by(state-name) %>%
na_interpolation(dataframe)
您可以使用 split-apply-bind
方法:
do.call(rbind, lapply(split(dataframe, dataframe$state), na_interpolation))
作为一个有效的例子,采用以下虚拟数据:
set.seed(3)
dataframe <- data.frame(state = rep(c("A", "B", "C"), each = 5),
value = rnorm(15))
dataframe$value[sample(15, 4)] <- NA
dataframe
#> state value
#> 1 A -0.96193342
#> 2 A NA
#> 3 A 0.25878822
#> 4 A -1.15213189
#> 5 A 0.19578283
#> 6 B 0.03012394
#> 7 B 0.08541773
#> 8 B NA
#> 9 B NA
#> 10 B 1.26736872
#> 11 C -0.74478160
#> 12 C NA
#> 13 C -0.71635849
#> 14 C 0.25265237
#> 15 C 0.15204571
那么我们可以这样做:
library(imputeTS)
do.call(rbind, lapply(split(dataframe, dataframe$state), na_interpolation))
#> state value
#> A.1 A -0.96193342
#> A.2 A -0.35157260
#> A.3 A 0.25878822
#> A.4 A -1.15213189
#> A.5 A 0.19578283
#> B.6 B 0.03012394
#> B.7 B 0.08541773
#> B.8 B 0.47940140
#> B.9 B 0.87338506
#> B.10 B 1.26736872
#> C.11 C -0.74478160
#> C.12 C -0.73057004
#> C.13 C -0.71635849
#> C.14 C 0.25265237
#> C.15 C 0.15204571
由 reprex package (v0.3.0)
于 2020-12-12 创建您应该可以按组申请 na_interpolation
。尝试:
library(dplyr)
interpolation <- dataframe %>%
group_by(state) %>%
mutate(value = imputeTS::na_interpolation(value))
选项data.table
library(data.table)
setDT(dataframe)[, value := imputeTS::na_interpolation(value), state]