R 如何为每个变量重新编码具有不同值的多个变量

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

我有一个包含100多个变量的调查数据集,几乎所有的数据集都有1-10个代码值。每列的代码值在另一个df中提供

示例数据:


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