R语言管道遍历列表子集数据并调用自定义函数计算的实现问题
R语言多列匹配索引批量计算结果实现方案
原始数据集结构
你拥有的数据集包含from、to、time三列及其他附加列,示例结构如下:
structure(list(from = c(1, 8, 3, 3, 8, 1, 4, 5, 8, 3, 1, 8, 4, 1), to = c(8, 3, 8, 54, 3, 4, 1, 6, 7, 1, 4, 3, 8, 8), time = c(1521823032, 1521827196, 1521827196, 1522678358, 1522701516, 1522701993, 1522702123, 1522769399, 1522780956, 1522794468, 1522794468, 1522794468, 1522794468, 1522859524)), class = "data.frame", row.names = c(NA, -14L))
需求说明
- 提取所有小于等于指定数值(示例为5)的有效索引(即索引需要在
from或to列中出现过) - 对每个索引,筛选出
from等于该索引或to等于该索引的所有行 - 调用自定义函数计算该子集的对应结果(示例为
time列最大值减最小值的差值) - 最终输出包含索引和对应计算结果的dataframe,示例预期输出:
| 索引 | 计算结果 |
|---|---|
| 1 | 1036492 |
| 3 | 967272 |
| 4 | 92475 |
原有代码问题
原有代码的核心问题是没有对索引列表逐一遍历计算,直接把整个索引列表传入过滤函数,只会得到全局的计算结果,无法拆分到每个索引。
正确实现代码
首先加载依赖包,定义公共函数:
library(tidyverse) # 自定义差值计算函数 dur <- function(x) max(x) - min(x) # 自定义按索引过滤数据集函数 filternumber <- function(number, x){ x <- x %>% filter(from == number | to == number) return(x) }
接下来执行计算逻辑:
# 生成符合要求的有效索引列表 lista <- unique(c(data$from, data$to)) lista <- lista[lista <= 5] # 遍历每个索引计算结果,合并为最终dataframe result <- map_dfr(lista, function(num){ sub_time <- filternumber(num, data) %>% pull(time) tibble(索引 = num, 计算结果 = dur(sub_time)) })
如果不想使用purrr包,也可以用基础R的lapply实现:
result <- do.call(rbind, lapply(lista, function(num){ sub_data <- filternumber(num, data) data.frame(索引 = num, 计算结果 = dur(sub_data$time)) }))
内容的提问来源于stack exchange,提问作者Usuario5678
相关产品推荐
相关产品推荐

