【问题标题】:R dplyr mutate_at accessing colnamesR dplyr mutate_at 访问列名
【发布时间】:2020-07-21 13:59:23
【问题描述】:

如何访问dplyr::mutate_at 正在处理的列名?

假设我们想将数据框中的一列转换为因子,其级别存储在单独的列表中。

df <- data.frame("C1"=c("A","B","C"), "C2"=c("D","E","F"))
df
  C1 C2
1  A  D
2  B  E
3  C  F

lst <- list("C2"=c("F","E","D"), "C3"=c("G","H","I"))
lst
$C2
[1] "F" "E" "D"

$C3
[1] "G" "H" "I"

以下所有触发错误或将所有列值替换为NA:

df %>%
mutate_at(vars(C2), function(x) factor(x, levels=lst$.))

df %>%
mutate_at(vars(C2), function(x) factor(x, levels=lst[[colnames(.)]]))

df %>%
mutate_at(vars(C2), function(x){col = as.name(.); factor(x, levels=lst$col))

【问题讨论】:

  • mutate_atdplyr v1.0.0 中已被across 功能取代。这对你来说是一个选择吗?
  • 不幸的是,这不是我的选择

标签: r dplyr


【解决方案1】:

在使用intersect 获取公共列后,您可以在base R 中使用Mapmap2 中的map2

cols <- intersect(names(lst), names(df))
df[cols] <- Map(function(x, y) factor(x, levels = y), df[cols], lst[cols])

或者

df[cols] <- purrr::map2(df[cols], lst[cols], ~factor(.x, levels = .y))

【讨论】:

  • 谢谢,效果很好。但是我现在需要坚持dplyr(或至少使用管道)
  • 这里不需要管道,但如果你坚持df[cols] &lt;- df[cols] %&gt;% map2(lst[cols], ~factor(.x, levels = .y)) 可以工作吗?
  • 我的意思是从整个df 进行管道化,而不是通过df[cols] 的列进行子集化。
  • @u31889 抱歉,我不知道有一个dplyr 方法来做到这一点(我怀疑它是否存在)。在阅读了您的问题后,这种方法对我来说似乎更自然,因此我将其发布为答案。使用dplyr 可能会有一种非常复杂的方式来做到这一点,如果你找到它,请将它作为答案发布。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-11-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-09-14
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多