R 将某些数据帧值转换为NA:要转换的值依赖于列,并在单独的列表中给出
在数据帧中,我想将一些值转换为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中的有效值。 其次,加入有效值并检查当前值是否为有效值:R 将某些数据帧值转换为NA:要转换的值依赖于列,并在单独的列表中给出,r,list,dataframe,dplyr,tidyr,R,List,Dataframe,Dplyr,Tidyr,在数据帧中,我想将一些值转换为NA。哪些值应变为NA取决于列。此基于列的值规范在单独的列表对象中给出。我想编写一个函数,该函数将接受: 要清理的数据帧 指定要清理哪些列的向量 对于每列,指定每个值的列表是ok的 并将返回一个干净的数据帧,其中不需要的值变为NA。虽然这样的任务可以通过for循环来完成,但我正在尝试找出是否有一种更简单的迭代方法来完成它。我通常喜欢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