如何使用map从数据框列表中提取数据框名称?
解决方法
要在遍历数据框列表时获取当前数据框的名称,直接用map无法拿到对应名称,推荐用purrr::imap函数——它是map的变体,会同时传递列表元素和对应的名称作为参数,刚好能替代代码里的YYY位置。
修改后的完整代码如下:
library(dplyr) library(purrr) df1 <- data.frame(var1=seq(1:10), var2=seq(1:10), ID=1) df2 <- data.frame(var2=seq(1:10), ID=2) df3 <- data.frame(var3=seq(1:10), ID=3) df_lst <- tibble::lst(df1, df2, df3) codebook= data.frame(var.name = c("var1", "var2", "var3", "ID"), df.name=c("df1", "df2", "df3", "ALL")) # 用imap替代map,.y就是当前数据框的名称 result <- imap(df_lst, ~ { data_sub <- codebook %>% filter(var.name %in% names(.x) & df.name %in% c(.y, "ALL")) .x %>% select(data_sub$var.name) })
- 逻辑说明:
imap里的.x对应列表中的单个数据框,.y就是该数据框的名称(比如遍历到df1时,.y就是字符串"df1") - 这样就能精准匹配
codebook里的df.name字段,筛选出当前数据框对应的变量,再通过select提取目标变量
如果习惯用map2,也可以手动传入列表和名称列表,效果完全一致:
result <- map2(df_lst, names(df_lst), ~ { data_sub <- codebook %>% filter(var.name %in% names(.x) & df.name %in% c(.y, "ALL")) .x %>% select(data_sub$var.name) })
内容的提问来源于stack exchange,提问作者Stataq
相关产品推荐
相关产品推荐

