【问题标题】:Automate replacement of missing data on a sequence of variables using mutate_all使用 mutate_all 自动替换一系列变量上的缺失数据
【发布时间】:2020-02-27 04:49:24
【问题描述】:

我正在尝试使用 ifelse 语句和 mutate_all 函数自动化流程以完成一系列变量的缺失值。该问题涉及具有许多变量名称的数据框,例如 ax1、bx1、...zx1、ax2、bx2、...zx2、ax3、bx3、...zx3。以下数据给出了一个小场景:

df<-data.frame(
  "id"  = c(1:5),
  "ax1" = c(1, "NA", 8, "NA", 17),
  "bx1" = c(2, 7, "NA", 11, 12),
  "ax2" = c(2, 1, 8, 15, 17),
  "bx2" = c(2, 6, 4, 13, 11))

该过程是将带有结尾“x1”的变量上的缺失值替换为带有结尾“x2”的变量上的对应值。也就是说,如果 ax1 缺失,则将其替换为 ax2,并且 bx1 上的任何缺失都将替换为 bx2,依此类推。由于存在比这里介绍的场景更多的变量,我正在寻找一种方法来自动化这个过程。我尝试了以下代码

library(dplyr)
df <- df %>% 
mutate_all(vars(ends_with("x1", "x2")), function(x,y)
           ifelse(is.na(x), y, x)))

但它不起作用。我非常感谢这方面的任何帮助。 预期的输出是

   id ax1 bx1 ax2 bx2
   1   1   2   2   2
   2   1   7   1   6
   3   8   4   8   4
   4  15  11  15  13
   5  17  12  17  11

【问题讨论】:

  • ax2ax3 中的缺失值怎么办?他们被替换了吗?或者您只想替换 ax1 中的缺失值?
  • @RonakShah 谢谢! ax2 和 ax3 中的缺失值不会被替换。我想替换以 x1 结尾的变量的缺失值,例如ax1 和 bx1。
  • 您的失踪并不是真正失踪,因为您在 NA 周围有引号。您不需要在 NA 或列名周围加上引号,例如“id”应该只是数据框创建位中的id

标签: r dataframe subset dplyr


【解决方案1】:

在基础 R 中,我们可以使用 Mapx1 中的 NA 值替换为 x2 中对应的 NA 值。

x1_cols <- grep('x1$', names(df))
x2_cols <- grep('x2$', names(df))

df[x1_cols] <- Map(function(x, y) {x[is.na(x)] <- y[is.na(x)];x}, 
                                   df[x1_cols], df[x2_cols])

df
#  id ax1 bx1 ax2 bx2
#1  1   1   2   2   2
#2  2   1   7   1   6
#3  3   8   4   8   4
#4  4  15  11  15  13
#5  5  17  12  17  11

我们可以使用同样的逻辑,使用purrr::map2

df[x1_cols] <- purrr::map2(df[x1_cols], df[x2_cols], 
                      ~{.x[is.na(.x)] <- .y[is.na(.x)];.x})

数据

稍微修改了数据,确保NA 是实际的NAs,而不是实际上将列作为因子的字符串“NA”。

df<-data.frame(id=c(1:5),
               ax1=c(1,NA,8,NA,17),
               bx1=c(2,7,NA,11,12),
               ax2=c(2,1,8,15,17),
               bx2=c(2,6,4,13,11))

【讨论】:

  • 我认为这对于要替换缺失值的列/变量非常具体。正如我提到的,我正在对许多变量执行此操作,例如 ax1、bx1、cx1、dx1 等。我认为 mutate_all 会让它变得不那么麻烦?
  • @TRichard mutate_all 将适用于所有列。由于您只想更改特定列(ends_with("x1")),我们可以使用mutate_at,但它不知道它的对应列,即ax1 不知道ax2。如果我们在mutate_at 中同时包含“x1”和“x2”列,则会更改这两列。
猜你喜欢
  • 1970-01-01
  • 2021-09-03
  • 2014-10-04
  • 1970-01-01
  • 2020-08-20
  • 2021-04-13
  • 2010-10-06
  • 1970-01-01
  • 2021-08-18
相关资源
最近更新 更多