根据r中的多个列重新编码NAs
我有很多调查数据,受访者被问到许多不同的选择题,他们可以选择多个答案。调查软件将每个问题编码为多个变量,这些变量的值可以是答案或NA。不过,NA并不十分合适,因为除非个人跳过了问题,否则不选择答案实际上意味着“不”。我想对所有此类问题重新编码以解决这一问题,以便分析数据。如果该个人跳过了NAs应包含的问题,但他们至少单击了一个多选项,则NAs应为“否”。 示例如下:根据r中的多个列重新编码NAs,r,dplyr,R,Dplyr,我有很多调查数据,受访者被问到许多不同的选择题,他们可以选择多个答案。调查软件将每个问题编码为多个变量,这些变量的值可以是答案或NA。不过,NA并不十分合适,因为除非个人跳过了问题,否则不选择答案实际上意味着“不”。我想对所有此类问题重新编码以解决这一问题,以便分析数据。如果该个人跳过了NAs应包含的问题,但他们至少单击了一个多选项,则NAs应为“否”。 示例如下: library(tidyverse) df <- tibble(SC_1 = c("yes", "yes", NA, "ye
library(tidyverse)
df <- tibble(SC_1 = c("yes", "yes", NA, "yes", "yes", NA, "yes", "yes", NA, "yes"),
SC_2 = c("yes", NA, NA, NA, "yes", "yes", NA, "yes", NA, "yes"),
RF_1 = c("gas", "gas", NA, "gas", "gas", NA, "gas", "gas", NA, "gas"),
RF_2 = c("electricity", NA, NA, NA, "electricity", "electricity", NA, "yes", NA, "electricity"))
库(tidyverse)
df%突变(SC_1_编码=ifelse(is.na(SC_1)和is.na(SC_2),SC_1,
如果其他(is.na(SC_1),“no”,SC_1)),
SC_2_recode=ifelse(is.na(SC_1)和is.na(SC_2),SC_2,
如果其他(is.na(SC_2),“no”,SC_2)),
RF_1_recode=ifelse(is.na(RF_1)和is.na(RF_2),RF_1,
如果其他(is.na(RF_1),“no”,RF_1)),
RF_2_recode=ifelse(is.na(RF_1)和is.na(RF_2),RF_2,
ifelse(is.na(RF_2),“no”,RF_2)))
#SC_1 SC_2 RF_1 RF_2 SC_1_记录SC_2_记录RF_1_记录RF_2_记录
#
#1是是燃气电是燃气电
#2是NA气体NA是否气体否
#3钠钠钠钠钠钠钠钠钠钠钠钠钠钠钠钠钠钠钠钠钠钠钠钠钠钠钠钠钠钠钠钠钠钠钠钠钠钠钠钠钠钠钠钠钠钠钠钠钠钠钠钠钠钠钠钠钠钠钠钠
#4是NA气体NA是否气体否
#5是是气电是气电
#6不适用是不适用电不适用是不适用电
#7是不适用气体不适用气体不适用
#8是是气体是是气体是
#9不,不,不,不,不
#10是是燃气电是燃气电
但这似乎很麻烦,因为我有几十个这样的问题,他们都有这个问题。
有什么想法吗?我一直在尝试
mutate\u if()
,但没有取得任何进展。如果我们对多个列执行此操作,一个选项是使用pivot\u longer
将其重塑为“long”格式并应用该函数
library(dplyr)
library(tidyr)
library(stringr)
f1 <- function(x) case_when(all(is.na(x))~ NA_character_,
is.na(first(x)) ~ "no",
TRUE ~ first(x))
df %>%
mutate(rn = row_number()) %>%
pivot_longer(cols = -rn, names_to = c(".value", "group"), names_sep = "_")%>%
group_by(rn) %>%
mutate_at(vars(SC:RF), f1) %>%
ungroup %>%
filter(group == 1) %>%
select(SC:RF) %>%
rename_all(~ str_c(., "_1_recode")) %>%
bind_cols(df, .)
# A tibble: 10 x 6
# SC_1 SC_2 RF_1 RF_2 SC_1_recode RF_1_recode
# <chr> <chr> <chr> <chr> <chr> <chr>
# 1 yes yes gas electricity yes gas
# 2 yes <NA> gas <NA> yes gas
# 3 <NA> <NA> <NA> <NA> <NA> <NA>
# 4 yes <NA> gas <NA> yes gas
# 5 yes yes gas electricity yes gas
# 6 <NA> yes <NA> electricity no no
# 7 yes <NA> gas <NA> yes gas
# 8 yes yes gas yes yes gas
# 9 <NA> <NA> <NA> <NA> <NA> <NA>
#10 yes yes gas electricity yes gas
library(purrr)
df %>%
split.default(str_remove(names(.), "_\\d+$")) %>%
map_dfc(~
.x %>%
transmute(!! str_c(names(.)[1], "_1_recode") :=
coalesce(!!! .) %>%
replace(., !is.na(.) & is.na(!! rlang::sym(names(.)[1])), "no"))) %>%
bind_cols(df, .)
如果我们对多个列执行此操作,一个选项是使用
pivot\u longer
将其重塑为“long”格式并应用该函数
library(dplyr)
library(tidyr)
library(stringr)
f1 <- function(x) case_when(all(is.na(x))~ NA_character_,
is.na(first(x)) ~ "no",
TRUE ~ first(x))
df %>%
mutate(rn = row_number()) %>%
pivot_longer(cols = -rn, names_to = c(".value", "group"), names_sep = "_")%>%
group_by(rn) %>%
mutate_at(vars(SC:RF), f1) %>%
ungroup %>%
filter(group == 1) %>%
select(SC:RF) %>%
rename_all(~ str_c(., "_1_recode")) %>%
bind_cols(df, .)
# A tibble: 10 x 6
# SC_1 SC_2 RF_1 RF_2 SC_1_recode RF_1_recode
# <chr> <chr> <chr> <chr> <chr> <chr>
# 1 yes yes gas electricity yes gas
# 2 yes <NA> gas <NA> yes gas
# 3 <NA> <NA> <NA> <NA> <NA> <NA>
# 4 yes <NA> gas <NA> yes gas
# 5 yes yes gas electricity yes gas
# 6 <NA> yes <NA> electricity no no
# 7 yes <NA> gas <NA> yes gas
# 8 yes yes gas yes yes gas
# 9 <NA> <NA> <NA> <NA> <NA> <NA>
#10 yes yes gas electricity yes gas
library(purrr)
df %>%
split.default(str_remove(names(.), "_\\d+$")) %>%
map_dfc(~
.x %>%
transmute(!! str_c(names(.)[1], "_1_recode") :=
coalesce(!!! .) %>%
replace(., !is.na(.) & is.na(!! rlang::sym(names(.)[1])), "no"))) %>%
bind_cols(df, .)
你能添加预期输出吗?你能添加预期输出吗?