R 如何为每个变量重新编码具有不同值的多个变量
我有一个包含100多个变量的调查数据集,几乎所有的数据集都有1-10个代码值。每列的代码值在另一个df中提供 示例数据:R 如何为每个变量重新编码具有不同值的多个变量,r,dplyr,tidyverse,recode,R,Dplyr,Tidyverse,Recode,我有一个包含100多个变量的调查数据集,几乎所有的数据集都有1-10个代码值。每列的代码值在另一个df中提供 示例数据: survey_df = structure(list(resp_id = 1:5, gender = c("1", "2", "2", "1", "1"), state = c("1", "2", "3", &qu
survey_df = structure(list(resp_id = 1:5, gender = c("1", "2", "2", "1",
"1"), state = c("1", "2", "3", "1", "4"), education = c("1",
"1", "1", "2", "2")), class = "data.frame", row.names = c(NA,
-5L))
由于调查列会随着时间/产品的变化而变化,我希望避免任何硬编码的重新编码,因此有一个函数,该函数将输入一个列名,并从编码的\u df返回一个“命名向量”
get_named_vec <- function(x) {
tmp_chr <- coded_df %>%
filter(col == x) %>%
mutate(col_values = str_replace_all(col_values, "\\n", "")) %>%
separate_rows(col_values, sep = ",") %>%
separate(col_values, into = c("var1", "var2"), sep = "-") %>%
mutate(var1 = as.character(as.numeric(var1)),
var2 = str_trim(var2)) %>%
pull(var2, var1)
return(tmp_chr)
}
到目前为止,这项工作每列的基础上,这意味着100+执行
但是我如何通过mutate_at来运行它,以便在单个执行中有选择地重新编码某些变量呢
# This does not work.
to_update_col<-c("state","gender")
survey_df%>%
mutate_at(.vars=all_of(to_update_col),.funs=function(x) recode(x,!!!get_named_vec(x))))
#这不起作用。
要更新\u列%
在(.vars=all_of(to_update_col),.funs=function(x)recode(x,!!!get_named_vec(x)))处进行变异
非常感谢任何帮助
谢谢
Vinay我希望将其转换为pivot-join-pivot操作会更简单、更高效,在该操作中,您可以将源表和查找表转换为长格式,将它们连接起来,然后重新调整为宽格式
survey_df %>%
pivot_longer(-resp_id) %>%
left_join(coded_df_long, by = c("name" = "col", "value" = "old")) %>%
select(-value) %>%
pivot_wider(names_from = name, values_from = new)
鉴于此调查信息:
survey_df = structure(list(resp_id = 1:5,
gender = c(1L, 2L, 2L, 1L, 1L),
state = c(1, 2, 3, 1, 4),
education = c(1L, 1L, 1L, 2L, 2L)), class = "data.frame", row.names = c(NA, -5L)) %>%
mutate(across(-resp_id, as.character))
我们可以将查找表转换为长格式:
coded_df_long <- coded_df %>%
separate_rows(col_values, sep = ",") %>%
separate(col_values, c("old", "new"), extra = "merge")
结果
# A tibble: 5 x 4
resp_id gender state education
<int> <chr> <chr> <chr>
1 1 Male CA High School
2 2 Female TX High School
3 3 Female AZ High School
4 4 Male CA Bachelor
5 5 Male CO Bachelor
#一个tible:5 x 4
负责性别国家教育
1男CA高中
德克萨斯州2所女子高中
3 AZ女子高中
4男CA学士
5男学士
获取命名向量()
不起作用。对于初学者来说,col\u value
的列引用应该是coded\u df
中的col\u value
。在coded_df
中,替换值位于状态
的等号左侧(假设在survey_df
中它们被编码为“CO”、“CA”等),但对于其他变量,替换值位于等号右侧。那是你的意图吗?您是否试图将测量值从数字表示形式重新编码为字符串表示形式?在创建伪df+函数时出现打字错误。修正了更新。这太棒了!。。这适用于问题中的虚拟数据帧。我正在尝试我的实际调查,这将恢复。有趣的是,我专注于“重新编码”,我错过了连接!!!把这个也放在这里,以防有人在这里导航时遇到类似的问题。虽然pivots/Separate对我有所帮助,但以下内容也可以直接使用,正如我最初通过函数预期的那样。函数(x){var\u name
survey_df %>%
pivot_longer(-resp_id) %>%
left_join(coded_df_long, by = c("name" = "col", "value" = "old")) %>%
select(-value) %>%
pivot_wider(names_from = name, values_from = new)
# A tibble: 5 x 4
resp_id gender state education
<int> <chr> <chr> <chr>
1 1 Male CA High School
2 2 Female TX High School
3 3 Female AZ High School
4 4 Male CA Bachelor
5 5 Male CO Bachelor