我有一个数据框,我在其中重新编码了几列,以便将 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/