使用 dplyr 重新编码多列
Recode multiple columns using dplyr
我有一个数据框,我在其中重新编码了几列,以便将 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))))
但我收到警告 "Unreplaced values treated as NA as .x is not compatible. Please specify replacements exhaustively or supply .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
我无法准确理解您想要完成的任务,所以如果不完全请告诉我。
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))
y
#> y1 y2 y3
#> 1 1 1 TRUE
#> 2 2 2 TRUE
#> 3 999 999 FALSE
#> 4 3 3 FALSE
#> 5 4 4 TRUE
z <- y %>%
mutate_at(vars(y1:y2), ~ifelse(. == 999, NA, .))
z
#> y1 y2 y3
#> 1 1 1 TRUE
#> 2 2 2 TRUE
#> 3 NA NA FALSE
#> 4 3 3 FALSE
#> 5 4 4 TRUE
现在 funs
已经在 dplyr 中贬值,这是新的方法:
z <- y %>%
mutate_if(is.integer, as.numeric) %>%
mutate_at(vars(y1:y2), list(~recode(.,`999` = NA_real_)))
将funs
替换为list
并在recode
前插入一个~
。
如果您尝试将某些内容重新编码为 NA,na_if() 函数也应该有效。
目前,基于dplyr documentation:
across() supersedes the family of "scoped variants" like summarise_at(), summarise_if(), and summarise_all().
因此,现在建议使用 mutate
和 across
。
和Chris LeBoa 一样,如果你只想把一个烦人的值转换成NA
,函数na_if()
可能是最好的选择:
y <- data.frame(y1=c(1,2,999,3,4), y2=c(1L, 2L, 999L, 3L, 4L), y3=c(T,T,F,F,T))
y
y1 y2 y3
1 1 1 TRUE
2 2 2 TRUE
3 999 999 FALSE
4 3 3 FALSE
5 4 4 TRUE
z <- y %>%
mutate(across(
y1:y2,
~na_if(., 999)
))
z
y1 y2 y3
1 1 1 TRUE
2 2 2 TRUE
3 NA NA FALSE
4 3 3 FALSE
5 4 4 TRUE
同样,如果你真的想recode
多列的值,你可以按照example from bcarothers:
df1 <- tibble(Q7_1=1:5,
Q7_1_TEXT=c("let's","see","grogu","this","week"),
Q8_1=6:10,
Q8_1_TEXT=rep("grogu",5),
Q8_2=11:15,
Q8_2_TEXT=c("grogu","is","the","absolute","best"))
df2 <- df1 %>%
mutate(across(
starts_with("Q8") & ends_with("TEXT"),
~recode(., "grogu"="mando")
))
我有一个数据框,我在其中重新编码了几列,以便将 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))))
但我收到警告 "Unreplaced values treated as NA as .x is not compatible. Please specify replacements exhaustively or supply .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
我无法准确理解您想要完成的任务,所以如果不完全请告诉我。
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))
y
#> y1 y2 y3
#> 1 1 1 TRUE
#> 2 2 2 TRUE
#> 3 999 999 FALSE
#> 4 3 3 FALSE
#> 5 4 4 TRUE
z <- y %>%
mutate_at(vars(y1:y2), ~ifelse(. == 999, NA, .))
z
#> y1 y2 y3
#> 1 1 1 TRUE
#> 2 2 2 TRUE
#> 3 NA NA FALSE
#> 4 3 3 FALSE
#> 5 4 4 TRUE
现在 funs
已经在 dplyr 中贬值,这是新的方法:
z <- y %>%
mutate_if(is.integer, as.numeric) %>%
mutate_at(vars(y1:y2), list(~recode(.,`999` = NA_real_)))
将funs
替换为list
并在recode
前插入一个~
。
如果您尝试将某些内容重新编码为 NA,na_if() 函数也应该有效。
目前,基于dplyr documentation:
across() supersedes the family of "scoped variants" like summarise_at(), summarise_if(), and summarise_all().
因此,现在建议使用 mutate
和 across
。
和Chris LeBoa NA
,函数na_if()
可能是最好的选择:
y <- data.frame(y1=c(1,2,999,3,4), y2=c(1L, 2L, 999L, 3L, 4L), y3=c(T,T,F,F,T))
y
y1 y2 y3
1 1 1 TRUE
2 2 2 TRUE
3 999 999 FALSE
4 3 3 FALSE
5 4 4 TRUE
z <- y %>%
mutate(across(
y1:y2,
~na_if(., 999)
))
z
y1 y2 y3
1 1 1 TRUE
2 2 2 TRUE
3 NA NA FALSE
4 3 3 FALSE
5 4 4 TRUE
同样,如果你真的想recode
多列的值,你可以按照example from bcarothers:
df1 <- tibble(Q7_1=1:5,
Q7_1_TEXT=c("let's","see","grogu","this","week"),
Q8_1=6:10,
Q8_1_TEXT=rep("grogu",5),
Q8_2=11:15,
Q8_2_TEXT=c("grogu","is","the","absolute","best"))
df2 <- df1 %>%
mutate(across(
starts_with("Q8") & ends_with("TEXT"),
~recode(., "grogu"="mando")
))