如何在R语言中从含多条目列表提取指定名称的批量数据?
提取R列表中同名元素的集合
我有一个包含1000个子列表的R对象data,每个子列表都是带命名的向量(命名为a、b、p…n),由return(c("a" = a, "b" = b, ..., "n" = n))生成,示例如下:
> data [[1]] a b p d e f g h i j k l m n 0.1 0.2 0.3 0.4 0.5 0.6 0.7 0.8 0.9 1.0 1.1 1.2 1.3 1.4 [[2]] a b p d e f g h i j k l m n 0.4 0.2 0.5 0.4 0.8 1.6 0.5 0.8 0.1 1.9 1.3 2.2 1.3 1.4 [[3]] a b p d e f g h i j k l m n 0.6 0.8 2.3 3.4 1.5 2.6 1.7 1.8 0.8 1.5 1.0 1.0 1.4 1.6 [[4]] a b p d e f g h i j k l m n 0.5 0.1 0.8 1.4 1.5 1.6 2.7 0.8 0.9 1.9 1.2 1.3 1.5 1.0
需求:提取所有子列表中同名元素的集合,例如得到类似以下的结果:
# For a values > data$a 0.1 0.4 0.6 0.5 # For b values > data$b 0.2 0.2 0.8 0.1
以下是几种可行的解决方案:
方法1:使用purrr包(tidyverse生态)
如果已经安装了tidyverse包,purrr的函数可以简洁完成提取:
# 加载purrr包 library(purrr) # 提取单个元素(如a) a_values <- map_dbl(data, "a") a_values # 批量提取所有元素并转为数据框,方便后续统一操作 df <- map_dfr(data, ~as.data.frame(t(.x))) # 此时可直接通过列名访问 df$a df$b
方法2:基础R原生方法(无需额外包)
方式1:用sapply提取单个元素
适合只需要提取少数几个元素的场景:
# 提取a元素 a_values <- sapply(data, function(x) x["a"]) a_values # 提取b元素 b_values <- sapply(data, function(x) x["b"]) b_values
方式2:转换为矩阵
将列表转为矩阵后,通过列索引提取同名元素:
# 将所有子列表按行合并为矩阵 mat <- do.call(rbind, data) # 提取a列 mat[, "a"] # 提取b列 mat[, "b"]
方式3:转换为数据框
转为数据框后,可像操作普通数据框一样访问列:
# 将每个子列表转成单行数据框,再合并 df <- do.call(rbind, lapply(data, function(x) as.data.frame(t(x)))) # 访问a列 df$a # 访问b列 df$b
内容的提问来源于stack exchange,提问作者RRMT
相关产品推荐
相关产品推荐

