【问题标题】:Replace values conditionally over multiple columns with mutate in R在 R 中用 mutate 有条件地替换多个列上的值
【发布时间】:2021-07-03 12:08:52
【问题描述】:

我有一个包含 56 列的数据框。我需要在 50 列中用 NA 替换值,条件是“正 == 0”列的值。

我已经弄清楚如何使用 mutate 有条件地替换单个列中的值。我现在已经花了相当长的时间来弄清楚如何将此 mutate 函数应用于其他列,而不必重复该命令 50 次 - 无济于事。

必须有一个简单的解决方案。 ;) 有人可以帮忙吗?

这是数据的结构:

df <- data.frame(positive = c(1,1,0,0,1),
                 a = c("x","x","x","y","y"),
                 b = c("z","z","z","y","z"),
                 d = c(1,2,3,4,5))

这是我替换一列中的值的解决方案。

df <- df %>%
  mutate(a = replace(a, positive == 0, NA))

【问题讨论】:

  • 你试过mutate(across())吗?
  • 我在寻找解决方案时遇到过。 :) 但是我的编码技能太差了,无法将其应用于这个问题。此外,我不需要重新编码所有 56 列。只需约 50 个条件需要重新编码。

标签: r replace dplyr


【解决方案1】:
df %>% mutate(across(c(-positive,-d), ~replace(.,positive == 0, NA)))

[以前的错误解决方案 - 确实将值替换为 NA,但将其他值转换为 1。在 across() 调用中显示选择列的不同方式可能仍然有用。]

这似乎有效:

df %>% mutate(across(c(-positive,-d), ~na_if(positive, 0)))

这里我假设您想要改变除“positive”和“d”之外的所有列,但如果您更愿意指定列,您可以说:

df %>% mutate(across(c('a', 'b'), ~na_if(positive, 0)))

或者,就像在 na_if 函数的 dplyr documentation 中一样,您可以使用要指定它们的列的特征:

df %>% mutate(across(where(is.character), ~na_if(positive, 0)))

【讨论】:

  • 谢谢!这可以根据我的需要替换为 NA。但是,由于某种原因,重新编码列中的其他值被替换为 1。我不知道怎么来的。
  • 这发生在我申请df %&gt;% mutate(across(c(-positive,-d), ~na_if(positive, 0))) df %&gt;% mutate(across(c('a', 'b'), ~na_if(positive, 0)))之后
  • 嗯,我不知道为什么会这样,但这应该可行:df %&gt;% mutate(across(c(-positive,-d), ~replace(.,positive == 0, NA)))
  • 如果有请告诉我,我会修改答案。
  • 嗨,Elle,是的,这确实解决了这个问题!
猜你喜欢
  • 2020-02-10
  • 2016-01-21
  • 2016-11-29
  • 1970-01-01
  • 2019-09-08
  • 1970-01-01
  • 1970-01-01
  • 2013-07-13
  • 1970-01-01
相关资源
最近更新 更多