首页 > 解决方案 > 使用 dplyr 根据列名更改数据框中的值?

问题描述

我的问题看起来很简单,但想不出一个简单的解决方案。我的数据集中的所有分类变量都有一个“缺失”的值。为了稍后使用我自己的函数连接结果,我需要这个值是唯一的,所以我想要的是通过“缺失(var_name)”更改值“缺失”。

我首先尝试了类似的东西:

data %>% mutate(across(where(is.character),
                       ~ replace(., . == "missing", paste("missing", SOMETHING(.)))))

这不太有效,因为我错过了这个SOMETHING函数来访问整个across语句中的列名,只使用“。” 范围...

我尝试的另一个解决方案是使用

purrr:imap(data %>% select(where(is.character)),
           ~ replace(.x, .x == "missing", paste("missing", .y))))

这接近我想要的,但是我很难轻松地将purrr:imap输出重新插入到我的初始数据帧而不是初始字符列中。

我想我需要一些休息和/或一些帮助才能看得更清楚,因为我有点厌倦了与看似如此简单的事情作斗争......

我宁愿使用该dplyr解决方案,但purrr可以。实际上,任何工作都很好而且很快(你知道,我有 600 多个列和 150,000 行)

欢迎任何帮助或建议!

谢谢

标签: rpurrrdplyrnames

解决方案


示例数据

df <- data.frame(var.X = c("a", "missing", "a"),
                 var.Y = c("b", "b", "missing"),
                 var.Z = c("missing", "missing", "c"))

#     var.X   var.Y   var.Z
# 1       a       b missing
# 2 missing       b missing
# 3       a missing       c

通过dplyr,您可以使用cur_column()in across()。来自?context

cur_column() 给出当前列的名称(仅在 cross() 中)。

library(dplyr)

df %>%
  mutate(across(where(is.character),
                ~ recode(.x, missing = paste0("missing(", cur_column(), ")"))))

#            var.X          var.Y          var.Z
# 1              a              b missing(var.Z)
# 2 missing(var.X)              b missing(var.Z)
# 3              a missing(var.Y)              c

或者

df %>%
  mutate(across(where(is.character),
                ~ recode(.x, missing = sprintf("missing(%s)", cur_column()))))

推荐阅读