如何从数据框列表选取列?用purrr提取tibble列表列指定列
让我逐个帮你搞定这两个R语言的问题:
1. 从数据框列表中选取某一列
不管你偏好base R还是tidyverse工具,都有很顺手的方案:
tidyverse风格(purrr包):这是我个人推荐的写法,简洁又易读。假设你的数据框列表叫
df_list,要提取的列名为target_col,代码如下:library(purrr) # 提取后保留列表格式 selected_cols <- map(df_list, ~ .x$target_col) # 如果每列长度一致,想直接转成向量(根据数据类型选对应的map函数) selected_num_vec <- map_dbl(df_list, ~ .x$target_col) # 数值型 selected_char_vec <- map_chr(df_list, ~ .x$target_col) # 字符型base R原生写法:不想加载额外包的话,用
lapply/sapply也能解决:# 提取为列表 selected_cols <- lapply(df_list, function(x) x$target_col) # 转成向量(sapply会自动判断返回类型) selected_vec <- sapply(df_list, function(x) x$target_col)
2. 从tibble的列表列中提取子tibble的cigs列作为新列
当然有更简便的purrr方案!假设你的原tibble是my_tibble,存放子tibble的列表列叫sub_tibbles,这儿有几种清爽的写法:
方法1:直接用mutate + map_*函数(最常用)
如果cigs是数值型,用map_dbl直接把提取的列转成数值向量添加到原tibble:
library(dplyr) library(purrr) my_tibble <- my_tibble %>% mutate(cigs = map_dbl(sub_tibbles, ~ .x$cigs))
如果cigs是字符型就换map_chr,整数型用map_int,完美适配不同数据类型。
方法2:用pluck简化代码
purrr的pluck函数专门用来提取嵌套元素,写法更短:
my_tibble <- my_tibble %>% mutate(cigs = map_dbl(sub_tibbles, pluck("cigs")))
甚至可以用公式风格的简写,看起来更连贯:
my_tibble <- my_tibble %>% mutate(cigs = map_dbl(sub_tibbles, ~ pluck(., "cigs")))
方法3:保留列表格式(如果子tibble的cigs有多行)
要是每个子tibble的cigs列不止一个值,不想压平成单个值,直接用map就能保留列表列:
my_tibble <- my_tibble %>% mutate(cigs_list = map(sub_tibbles, ~ .x$cigs))
内容的提问来源于stack exchange,提问作者Demetri Pananos
相关产品推荐
相关产品推荐

