gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 10:40:54 25 4
gpt4 key购买 nike

我需要使用 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
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

给定两个示例数据集,函数对 df2 执行 na.locf 的结果由 df1 指示的国家/变量对应该是这样的:
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

真正的应用是一个更大的数据集,所以“调用”应该泛化。谢谢。

最佳答案

一种选择是加入 data.table on 'Country' 列,然后使用 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.locf0(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

关于r - 使用 na.locf 为特定国家/变量对扩展最后观察到的值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59935772/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com