1

我有一个欧洲国家的数据框,每个国家出现 10 次(10 天)。我想插入多列的 NA 值,我可以使用

library("imputeTS")
na_interpolation(dataframe)

但我想按状态插入所有 NA 值。怎么可能呢?我已经尝试了很多不同的解决方案,但没有一个对我有用。

作为伪代码,我想要类似的东西

na_interpolation(dataframe, groupby=state)

有什么可以起作用的吗?

不幸的是,这些代码示例对我不起作用

interpolation <- dataframe %>% 
  group_by(state-name) %>% 
  na_interpolation(dataframe)
4

3 回答 3

1

您应该可以na_interpolation按组申请。尝试 :

library(dplyr)

interpolation  <- dataframe %>%
                    group_by(state) %>%
                    mutate(value = imputeTS::na_interpolation(value))
于 2020-12-12T13:56:47.857 回答
0

一个选项data.table

library(data.table)
setDT(dataframe)[,  value := imputeTS::na_interpolation(value), state]
于 2020-12-12T16:52:28.197 回答
0

您可以使用以下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 包(v0.3.0)于 2020 年 12 月 12 日创建

于 2020-12-12T13:50:09.917 回答