R 将某些数据帧值转换为NA:要转换的值依赖于列,并在单独的列表中给出

R 将某些数据帧值转换为NA:要转换的值依赖于列,并在单独的列表中给出,r,list,dataframe,dplyr,tidyr,R,List,Dataframe,Dplyr,Tidyr,在数据帧中,我想将一些值转换为NA。哪些值应变为NA取决于列。此基于列的值规范在单独的列表对象中给出。我想编写一个函数,该函数将接受: 要清理的数据帧 指定要清理哪些列的向量 对于每列,指定每个值的列表是ok的 并将返回一个干净的数据帧,其中不需要的值变为NA。虽然这样的任务可以通过for循环来完成,但我正在尝试找出是否有一种更简单的迭代方法来完成它。我通常喜欢tidyverse解决方案,但对任何想法都很满意 示例数据 在下面的数据集中,每一列都有自己的一组有效值,这些值应该保留下来,其余的应该

在数据帧中,我想将一些值转换为NA。哪些值应变为NA取决于列。此基于列的值规范在单独的列表对象中给出。我想编写一个函数,该函数将接受:

要清理的数据帧 指定要清理哪些列的向量 对于每列,指定每个值的列表是ok的 并将返回一个干净的数据帧,其中不需要的值变为NA。虽然这样的任务可以通过for循环来完成,但我正在尝试找出是否有一种更简单的迭代方法来完成它。我通常喜欢tidyverse解决方案,但对任何想法都很满意

示例数据 在下面的数据集中,每一列都有自己的一组有效值,这些值应该保留下来,其余的应该变成NA

可供图书馆使用 设定2020年种子 生成随机字符串:https://stackoverflow.com/a/42734863/6105259 样本字符串% 突变政治=重政治!!!rlang::将\u namesvec\u political\u值设置为\u keep,.default=NA\u character\uhttps://stackoverflow.com/a/63916563/6105259 一个tibble:40x4 身份证颜色政治宗教身份 1 1 4共和国fzwue3975k 2 4共和党人mgxoe2220e 3 1民主党世俗派 4.1共和党世俗派 5 4 NA oqnfv1461t 6 2 NA ufhua9648n 7 1不可知论者 8.5民主党传统 9.2共和党无神论者 10 10 2 NA NKTSL2136 O 我想将上述内容扩展到df中感兴趣的任何变量

期望输出 指定向量

colnames_to_clean这里有一种可能性。 首先,将有效值放入TIBLE中

这样做的好处是,您现在可以轻松地使用tidyverse中的有效值。 其次,加入有效值并检查当前值是否为有效值:

df %>%
  gather(name, val, -id) %>%
  left_join(new_list, by = "name") %>% 
  group_by(name) %>%
  mutate(val = map2_chr(val, all_vals, ~if_else(.x %in% setdiff(.y, "other"), .x, NA_character_))) %>%
  select(-all_vals) %>%
  spread(name, val)

# A tibble: 40 x 4
      id color political  religion_status
   <int> <chr> <chr>      <chr>          
 1     1 4     republican NA             
 2     2 4     republican NA             
 3     3 1     democrat   secular        
 4     4 1     republican secular        
 5     5 4     NA         NA             
 6     6 2     NA         NA             
 7     7 1     NA         NA             
 8     8 5     democrat   traditional    
 9     9 2     republican NA             
10    10 2     NA         NA             
# ... with 30 more rows

老实说,你的问题太长,包含了一些无关的信息。您真正的问题是如何以半自动的方式解析调查数据以重新编码答案。但实际上还不清楚您真正想要从var_映射_列表中提取什么,因为您的示例甚至没有green_party,但在您的代码的其他地方有。尽量集中你的问题。谢谢你的评论。为了让问题更清楚,我试过多次修改这个问题,但可能还不够。绿党确实出现在数据中,但因为它不在var_mapping_列表中,我们知道绿党不属于数据,因此应该成为NA。var_mapping_list的全部目的是让我们知道哪些值应该保留在df中。我已经再次编辑了,希望它更清晰。如果需要进一步澄清,我将不胜感激。
df %>%
  gather(name, val, -id) %>%
  left_join(new_list, by = "name") %>% 
  group_by(name) %>%
  mutate(val = map2_chr(val, all_vals, ~if_else(.x %in% setdiff(.y, "other"), .x, NA_character_))) %>%
  select(-all_vals) %>%
  spread(name, val)

# A tibble: 40 x 4
      id color political  religion_status
   <int> <chr> <chr>      <chr>          
 1     1 4     republican NA             
 2     2 4     republican NA             
 3     3 1     democrat   secular        
 4     4 1     republican secular        
 5     5 4     NA         NA             
 6     6 2     NA         NA             
 7     7 1     NA         NA             
 8     8 5     democrat   traditional    
 9     9 2     republican NA             
10    10 2     NA         NA             
# ... with 30 more rows