基于另一数据框区间筛选匹配观测值的R语言问题
解决方案
先模拟示例数据方便测试(可替换为你的真实数据):
# 模拟GranLoc数据框:包含类别和区间上下限 GranLoc <- data.frame( class = c("A", "B", "C"), LimAm = c(0, 10, 20), LimAv = c(10, 20, 30) ) # 模拟Slope_dist数据框:包含Position和其他观测值 Slope_dist <- data.frame( Position = c(5, 12, 18, 25, 8, 22), Value = c(1.2, 3.4, 2.1, 4.5, 0.9, 3.8) )
方法1:Base R 实现(无需额外包)
apply默认会把数据框转为矩阵处理,易因类型不匹配出错,改用lapply遍历行索引更可靠:
# 生成筛选后的列表 result_list <- lapply(1:nrow(GranLoc), function(i) { lower <- GranLoc$LimAm[i] upper <- GranLoc$LimAv[i] # 筛选Position落在[lower, upper)区间的行,可根据需求改为<= upper Slope_dist[Slope_dist$Position >= lower & Slope_dist$Position < upper, ] }) # 给列表命名,对应GranLoc的class列 names(result_list) <- GranLoc$class
方法2:tidyverse 风格实现
若习惯tidyverse工具链,用purrr::map更简洁:
library(tidyverse) result_list <- GranLoc %>% split(.$class) %>% # 按class拆分GranLoc map(function(group) { Slope_dist %>% filter(Position >= group$LimAm, Position < group$LimAv) # 区间筛选 })
两种方法最终都会得到一个列表,每个元素对应GranLoc中一个class的筛选结果,列表名称与class一一对应。
内容的提问来源于stack exchange,提问作者C. Guff
相关产品推荐
相关产品推荐

