如何在R语言数据框的列表列上应用between函数?
解决方案
我们可以利用dplyr和purrr包的行操作工具来批量处理这两个任务,以下是具体实现:
准备工作
首先加载所需包:
library(dplyr) library(purrr)
任务1:判断每行pool中是否存在处于边界内的元素
使用pmap_lgl函数逐行处理数据框,对每行的pool列表元素应用between判断,再通过any()确认是否存在符合条件的元素:
# 生成逻辑结果向量 task1_result <- pmap_lgl(test, function(left, right, pool) { # 转换pool为纯整数向量(去除附加属性) pool_vals <- as.integer(pool) any(between(pool_vals, left, right)) }) # 查看结果 task1_result # 输出: [1] FALSE FALSE TRUE TRUE
任务2:提取每行pool中处于边界内的元素
使用pmap函数逐行过滤pool中的元素,若没有符合条件的元素则返回NA,否则返回过滤后的向量:
# 生成结果列表 task2_result <- pmap(test, function(left, right, pool) { pool_vals <- as.integer(pool) filtered <- pool_vals[between(pool_vals, left, right)] if (length(filtered) == 0) NA else filtered }) # 查看结果 task2_result # 输出: [[1]] NA # [[2]] NA # [[3]] 223 # [[4]] [1] 491 568
可选:将结果添加到原数据框
如果需要将结果直接整合到原数据框中,可以使用dplyr::mutate结合行操作:
test_processed <- test %>% rowwise() %>% mutate( has_between = any(between(as.integer(pool), left, right)), between_elements = list( let( pool_vals = as.integer(pool), filtered = pool_vals[between(pool_vals, left, right)], if (length(filtered) == 0) NA else filtered ) ) ) %>% ungroup() # 查看处理后的数据框 test_processed
说明
pmap系列函数可以按行传递数据框的多列作为参数,非常适合处理每行包含列表的场景。as.integer(pool)用于去除pool元素的附加属性(如match.length等),只保留数值本身,方便后续判断和提取。rowwise()+mutate的方式更直观,适合需要保留原数据结构的场景。
内容的提问来源于stack exchange,提问作者BigMrE
相关产品推荐
相关产品推荐

