R语言循环批量筛选多数据集潜在ID变量的问题求助
问题解答
1. 修复循环代码的错误
你的循环报错核心原因是错误地在原数据集dflist[[i]]中引用skim统计列,而且单数据集里的筛选条件还写错了(把80%写成了1%)。直接修正代码如下:
dfid <- list() for (i in 1:4) { # 先缓存当前数据集,减少重复调用 current_df <- dflist[[i]] dfid[[i]] <- current_df %>% mutate_if(is.numeric, as.character) %>% skim() %>% as_tibble() %>% # 筛选条件1:唯一观测值占比≥80% filter(character.n_unique >= nrow(current_df) * 0.8) %>% # 筛选条件2:缺失值占比≤30% filter(n_missing <= nrow(current_df) * 0.3) }
错误说明:
- 原循环里的
dflist[[i]][,character.n_unique]完全没必要,skim()返回的结果已经自带character.n_unique(唯一值数量)和n_missing(缺失值数量)列,直接用列名筛选即可。 - 你单数据集里写的
nrow(dflist[[1]])*0.01是1%的阈值,和你要求的80%不符,必须改成*0.8才符合需求。
2. 合并去重得到唯一变量名向量
每个dfid[[i]]里的skim_variable列就是筛选出的潜在ID变量名,用以下方法合并去重:
方法1:Base R 实现
# 收集所有筛选后的变量名 all_candidate_vars <- c() for (i in 1:4) { all_candidate_vars <- c(all_candidate_vars, dfid[[i]]$skim_variable) } # 去重得到最终唯一变量向量 unique_id_vars <- unique(all_candidate_vars)
方法2:Tidyverse 简洁实现
library(tidyverse) unique_id_vars <- dfid %>% # 把每个列表元素的skim_variable列合并成一个数据框 map_dfr(~select(., skim_variable)) %>% # 提取成向量 pull(skim_variable) %>% # 去重 unique()
内容的提问来源于stack exchange,提问作者Rstudyer
相关产品推荐
相关产品推荐

