首页 > 解决方案 > R:将1000列中的NA更改为另一列的值

问题描述

我在这里找到了一些相反的问题: R:Replace multiple values in multiple columns of dataframes with NA

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

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

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 人,也无法发布。

标签: rreplacenas

解决方案


将列转换为字符并将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)))

推荐阅读