【问题标题】:R: Change NA in 1000s of columns to the value of another columnR:将1000列中的NA更改为另一列的值
【发布时间】:2021-10-25 02:48:48
【问题描述】:

我在这里找到了一个相反的问题: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 个人,但它太大了。

【问题讨论】:

  • 你试过dta1[vars] &lt;- lapply(dta1[vars], function(x) ifelse(is.na(x), dta1$var_fill, x))吗?您需要将因子变量强制转换为字符以避免这些警告,您可以在读取数据时这样做
  • 您想将该行中的所有 NA 行值替换为该行的 var_fill 列值,还是更奇特的?
  • 您无需与我们分享所有数据。具有 10 行和 4-5 列的示例数据框以及预期输出足以帮助我们理解问题。
  • @rawr,我试过了,但它做了一些奇怪的事情,所以我选择了下面的选项,但感谢您的回复!

标签: r replace nas


【解决方案1】:

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

【讨论】:

  • 做到了!除了不将 var_fill 转换为字符效果更好。当我这样做时,它对其中一些人做了一些奇怪的事情,但离开 numeric 效果很好,谢谢!
猜你喜欢
  • 1970-01-01
  • 2016-03-08
  • 2020-08-13
  • 1970-01-01
  • 2020-05-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多