使用 dplyr 重新编码多列

标签 r dplyr recode mutate

我有一个数据框,我在其中重新编码了几列,以便将 999 设置为 NA

dfB <-dfA %>%
  mutate(adhere = if_else(adhere==999, as.numeric(NA), adhere)) %>%
  mutate(engage = if_else(engage==999, as.numeric(NA), engage)) %>%
  mutate(quality = if_else(quality==999, as.numeric(NA), quality)) %>%
  mutate(undrstnd = if_else(undrstnd==999, as.numeric(NA), undrstnd)) %>%
  mutate(sesspart = if_else(sesspart==999, as.numeric(NA), sesspart)) %>%
  mutate(attended = if_else(attended>=9, as.integer(NA), attended))

我想使用 mutate_at() 和一系列列和 recode() 而不是 if_else(),但我坚持如何给它条件。我认为类似 999 = NA 基于一些 mutate_all 示例——但我还需要 NA 来匹配 .x 的类型,但我不确定如何让它成为类型敏感的

我试过:
y <- data.frame(y1=c(1,2,999,3,4), y2=c(1L, 2L, 999L, 3L, 4L), y3=c(T,T,F,F,T))
z <- y %>%
    mutate_at( vars(y1:y2), funs(recode(.,`999` = as.numeric(NA))))

但是我收到一条警告“未替换的值被视为 NA 作为 .x 不兼容。请详尽地指定替换或提供 .default”,我可以看到它是针对数字列的,但不是针对整数列 y2 的
> z
  y1 y2    y3
1  1 NA  TRUE
2  2 NA  TRUE
3 NA NA FALSE
4  3 NA FALSE
5  4 NA  TRUE

最佳答案

我认为这与列类型有关。我加了 mutate_if将所有整数列转换为数字,然后将重新编码值设置为 NA_real_ .它似乎工作。

library(dplyr)

y <- data.frame(y1=c(1,2,999,3,4), y2=c(1L, 2L, 999L, 3L, 4L), y3=c(T,T,F,F,T))

z <- y %>%
  mutate_if(is.integer, as.numeric) %>%
  mutate_at(vars(y1:y2), funs(recode(.,`999` = NA_real_)))
z
#   y1 y2    y3
# 1  1  1  TRUE
# 2  2  2  TRUE
# 3 NA NA FALSE
# 4  3  3 FALSE
# 5  4  4  TRUE

关于使用 dplyr 重新编码多列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47521920/

相关文章:

r - 在具有构面和多个几何图形的函数中使用 ggplot

r - “Erroneous nesting of equation structures”在rmarkdown中的多行方程式中使用“\begin{align}”到knit + pandoc pdf

r - 修改通过 ggplotly 创建的绘图的工具提示信息

r - 获取每行最频繁的值并说明关系

r - 从一个表中进行分组,然后使用其他表来计算欧氏距离

r - 如何对除某些变量之外的所有变量进行分组并为每个观察添加一个组 ID

r - 如何按组获取汇总统计数据

r - R 中命名参数的顺序求值

r - Dplyr:重新编码数字和字符向量

重新编码具有许多值(包括 NA)的数值变量