使用 dplyr 根据列名更改数据框中的值?
change values in dataframe according to column name with dplyr?
我的问题看起来很简单,但找不到简单的解决方案。
我的数据集中的所有分类变量都有一个“缺失”的值。
为了稍后使用 myown 的函数加入结果,我需要这个值是唯一的,所以我想要的是通过“missing (var_name)”更改值“missing”。
我首先尝试了类似的东西:
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
输出到我的初始数据帧而不是初始字符列。
我想我需要休息一下 and/or 一些帮助才能看得更清楚,因为我已经厌倦了与看起来如此简单的事情作斗争...
我宁愿使用 dplyr
解决方案,但 purrr
还可以。实际上,任何工作都很好而且很快(就像你知道的那样,我有超过 600 列和 150,000 行)
欢迎任何帮助或建议!
谢谢
示例数据
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
,您可以在across()
中使用cur_column()
。来自 ?context
:
cur_column() gives the name of the current column (in across() only).
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()))))
我的问题看起来很简单,但找不到简单的解决方案。 我的数据集中的所有分类变量都有一个“缺失”的值。 为了稍后使用 myown 的函数加入结果,我需要这个值是唯一的,所以我想要的是通过“missing (var_name)”更改值“missing”。
我首先尝试了类似的东西:
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
输出到我的初始数据帧而不是初始字符列。
我想我需要休息一下 and/or 一些帮助才能看得更清楚,因为我已经厌倦了与看起来如此简单的事情作斗争...
我宁愿使用 dplyr
解决方案,但 purrr
还可以。实际上,任何工作都很好而且很快(就像你知道的那样,我有超过 600 列和 150,000 行)
欢迎任何帮助或建议!
谢谢
示例数据
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
,您可以在across()
中使用cur_column()
。来自 ?context
:
cur_column() gives the name of the current column (in across() only).
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()))))