R语言中基于相关性阈值从dataframe提取符合条件行的实现方法
解决方案
前置说明
- 原始数据集存在Y列为NaN的无效行,计算相关性时会自动排除,我们可以提前清理避免重复计算
- 如果你需要枚举所有符合要求的10行子集,当前清理后共28条有效数据,总共有13123110种组合,计算量较大。如果不需要全量结果,可以用随机采样的方法快速获取符合要求的子集
实现代码
步骤1:数据加载与预处理
# 加载原始数据 df <- structure(list(X = c(0.47, 0.4723, 0.4747, 0.4771, 0.4794, 0.4818, 0.4842, 0.4866, 0.4889, 0.4913, 0.4937, 0.4961, 0.4984, 0.5008, 0.5032, 0.5103, 0.5173, 0.5244, 0.5315, 0.5386, 0.5457, 0.5527, 0.5598, 0.5709, 0.582, 0.593, 0.6041, 0.6152, 0.6263, 0.6373), Y = c(NaN, 255.5, 440, 110.5, 197.25, 438, 100, 467.75, 483.5, 492.25, 489.25, 503, 511.25, 508.25, 505, 511, 503.33, 501, 509.25, 508.25, 165.33, 102, 461.25, 392, 530.75, 537.75, NaN, 601, 523, 120)), row.names = c(NA, 30L), class = "data.frame") # 清理Y为NaN的无效行 df_clean <- df[!is.na(df$Y), ] # 配置参数 n_extract <- 10 # 需要提取的行数 cor_threshold <- 0.4 # 相关性阈值
方案1:全量枚举所有符合要求的子集(适合小数据量场景)
# 生成所有10行的索引组合 all_combs <- combn(nrow(df_clean), n_extract) # 遍历所有组合筛选符合条件的 valid_subsets <- list() for (i in 1:ncol(all_combs)) { idx <- all_combs[, i] subset_temp <- df_clean[idx, ] cor_val <- cor(subset_temp$X, subset_temp$Y) # 过滤符合相关性要求的子集,若只需判断正相关小于0.4可去掉abs() if (abs(cor_val) < cor_threshold) { valid_subsets[[length(valid_subsets) + 1]] <- subset_temp } } # 查看符合要求的子集总数 length(valid_subsets) # 取出第一个符合要求的子集查看示例 print(valid_subsets[[1]])
方案2:随机采样获取符合要求的子集(不需要全量结果时速度更快)
# 配置需要获取的子集数量,比如要找10个符合要求的子集 target_n <- 10 valid_subsets_sample <- list() set.seed(123) # 设置随机种子保证结果可复现 while (length(valid_subsets_sample) < target_n) { # 随机抽取10行 idx <- sample(nrow(df_clean), n_extract) subset_temp <- df_clean[idx, ] cor_val <- cor(subset_temp$X, subset_temp$Y) # 过滤规则可根据需求调整 if (abs(cor_val) < cor_threshold) { valid_subsets_sample[[length(valid_subsets_sample) + 1]] <- subset_temp } }
补充说明
- 如果需要使用斯皮尔曼等级相关而非皮尔逊相关,可以给
cor()函数添加method = "spearman"参数 - 输出结果
valid_subsets为列表格式,每个元素都是一个符合要求的10行数据子集,可直接后续使用
内容的提问来源于stack exchange,提问作者raghav
相关产品推荐
相关产品推荐

