基于列名向量的列表中的列的子集数据,并汇总列

时间:2017-11-10 00:17:58

标签: r list dataframe dplyr lapply

我有40个数据帧的列表。例如,子集看起来像:

d1<-data.frame(a=c(1,2,3,4,5), b=c("2006", "2006", "2006", "2007", "2007"), d=c(6,7,8,9,10), e=c(11,12,13,14,15))
d2<-data.frame(a=c(1,2,3,4,5), b=c("2006", "2006", "2006", "2007", "2007"), d=c(6,7,8,9,10), e=c(11,12,13,14,15))
d3<-data.frame(a=c(1,2,3,4,5), b=c("2006", "2006", "2006", "2007", "2007"), d=c(6,7,8,9,10), e=c(11,12,13,14,15))

mylist <- list(l1=d1, l2=d2, l3=d3)

我想基于列名矢量对数据库进行子集化:

subset_colnames <- c("a", "d", "e")

这样,在对数据帧进行子集化后,应该如下所示:

#Subsetting dataframes based on columns:
d1<-data.frame(a=c(1,2,3,4,5), b=c("2006", "2006", "2006", "2007", "2007"))
d2<-data.frame(d=c(6,7,8,9,10), b=c("2006", "2006", "2006", "2007", "2007"))
d3<-data.frame(e=c(11,12,13,14,15), b=c("2006", "2006", "2006", "2007", "2007"))

mylist_filtered = list(l1=d1, l2=d2, l3=d3)

最后,我想在subset_columns中为列表中的每个数据框汇总列名称,如下所示:

d1 %>% 
  group_by(b) %>% 
  summarise(mean = mean(a), n = n())

d2 %>% 
  group_by(b) %>% 
  summarise(mean = mean(d), n = n())

d3 %>% 
  group_by(b) %>% 
  summarise(mean = mean(e), n = n())

我想使用lapply执行此操作,查看解决方案herehere,但我的操作略显独特,因为我希望根据字符向量对列进行子集化

1 个答案:

答案 0 :(得分:2)

您可以使用Map,使用自定义函数从列表中获取数据框,并使用 subset_columns 中的列名称进行汇总;要将字符名称评估为summarize中的实际列,请使用rlang/tidyeval语法:

library(dplyr); library(rlang);

cust_mean <- function(df, col) {
    df %>% 
        group_by(b) %>% 
        summarise(mean = mean(!!sym(col)), n = n())
}

Map(cust_mean, mylist, subset_colnames)
#$l1
# A tibble: 2 x 3
#       b  mean     n
#  <fctr> <dbl> <int>
#1   2006   2.0     3
#2   2007   4.5     2

#$l2
# A tibble: 2 x 3
#       b  mean     n
#  <fctr> <dbl> <int>
#1   2006   7.0     3
#2   2007   9.5     2

#$l3
# A tibble: 2 x 3
#       b  mean     n
#  <fctr> <dbl> <int>
#1   2006  12.0     3
#2   2007  14.5     2