R:将 1000 列中的 NA 更改为另一列的值

R: Change NA in 1000s of columns to the value of another column

我在这里发现了一些反向问题:R: Replace multiple values in multiple columns of dataframes with NA

但我无法让它与我的数据一起使用。就我而言,我想找到 NA 并将它们替换为另一列中的值。

我有一个数据集 dta1,其中有 2493 个我有兴趣操作的变量。除了这 2493 个变量之外,还有一列 var_fill。当 vars 中命名的任何列为 NA 时,我想用 var_fill 中的值填充它。我尝试对上面的 posted 解决方案进行逆向工程,但它给了我多个警告:

1: In `[<-.factor`(`*tmp*`, list, value = structure(c(16946L,  ... :   invalid factor level, NA generated  
2: In x[...] <- m :   number of items to replace is not a multiple of replacement length

而且也行不通。

vars <- sprintf("var%0.4d",seq(1:2493))

dta1[vars] <- lapply(dta1[vars], function(x) replace(x,is.na(x), dta1$var_fill) )

抱歉,由于这些数据的大小,我无法生成完整的可重现数据集,所以我对其进行了大量子集化处理,但我正在处理大约 3000 列和 240K 行数据。

这是数据:https://drive.google.com/file/d/1oj_nhd99ftgN1Bh930_IRQftLACR2FO9/view?usp=sharing

虽然只有 10 个人,但对 post 来说太大了。

将列转换为字符并将 NA 值替换为相应的 var_fill 值。

dta1$var_fill <- as.character(dta1$var_fill)

dta1[vars] <- lapply(dta1[vars], function(x) {
                      x <- as.character(x)
                      x[is.na(x)] <- dta1$var_fill[is.na(x)]
                      x
                })

dplyr中,可以使用coalesce

library(dplyr)
dta1 <- dta1 %>% mutate(across(all_of(vars), ~coalesce(., var_fill)))