使用na.locf为特定的国家/变量对扩展最近观察到的值

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

我需要使用na.locf包中的zoo将NA值替换为最后观察到的值。但是,我只需要对特定的国家和变量对执行此操作。这些对是使用单独的数据帧在逻辑上指定的,其示例如下所示。

Country <- c("FRA", "DEU", "CHE")
acctm <- c(0, 0, 1)
acctf <- c(1, 1, 0)

df1 <- data.frame(Country, acctm, acctf)

  Country acctm acctf
1     FRA     0     1
2     DEU     0     1
3     CHE     1     0

a 1表示此对使用na.locf。下面显示了需要替换的数据集示例。

Country <- c("FRA", "FRA", "DEU", "DEU", "CHE", "CHE")
Year <- c(2010, 2020, 2010, 2020, 2010, 2020)
acctm <- c(20, 30, 10, NA, 20, NA)
acctf <- c(20, NA, 15, NA, 40, NA)

df2 <- data.frame(Country, Year, acctm, acctf)

   Country Year acctm acctf
1      FRA 2010    20    20
2      FRA 2020    30    NA
3      DEU 2010    10    15
4      DEU 2020    NA    NA
5      CHE 2010    20    40
6      CHE 2020    NA    NA

给出两个示例数据集,对于由df1表示的国家/变量对,在df2上执行na.locf的函数的结果应如下所示:

acctm <- c(20, 30, 10, NA, 20, 20)
acctf <- c(20, 20, 15, 15, 40, NA)

df3 <- data.frame(Country, Year, acctm, acctf)

  Country2 Year  acctm  acctf
1      FRA 2010     20     20
2      FRA 2020     30     20
3      DEU 2010     10     15
4      DEU 2020     NA     15
5      CHE 2010     20     40
6      CHE 2020     20     NA

实际的应用程序是一个更大的数据集,因此应该对“调用”进行概括。谢谢。

r na zoo
1个回答
0
投票

[一个选项是将data.table on添加到“国家”列中,然后使用Map根据第二列的相应列的值将na.locf应用于第二个数据集列(nm1)。第一个数据集并将输出分配(:=)回到各列

library(zoo)
library(data.table)
nm1 <- c('acctm', 'acctf')
nm2 <- paste0("i.", nm1)
setDT(df2)[df1, (nm1)  := Map(function(x, y) if(y == 1) na.locf(x)
      else x, mget(nm1), mget(nm2)), on = .(Country), by = .EACHI]
df2
#   Country Year acctm acctf
#1:     FRA 2010    20    20
#2:     FRA 2020    30    20
#3:     DEU 2010    10    15
#4:     DEU 2020    NA    15
#5:     CHE 2010    20    40
#6:     CHE 2020    20    NA

0
投票

我们可以使用data.table

library(data.table)
setDT(df2)[df1, acctm := if(i.acctm ==1) na.locf(acctm) else 
            acctm, on = .(Country), by = .EACHI]
© www.soinside.com 2019 - 2024. All rights reserved.