Re: [问题] aggregation on list of data frames

楼主: celestialgod (天)   2015-02-24 17:38:01
> [问题叙述]:
>
> 有个 list of data frames,
> 想用 row name 当做 key 来 aggregate 多个 data frame
>
>
> [程式范例]:
>
> l = list()
> l[[1]] = data.frame(row.names=c('a','b','c','d'), x=c(1,2,3,4))
> l[[2]] = data.frame(row.names=c('d','c','b','a'), x=c(1,2,3,4))
>
> 希望可以得到所有 data frame 的 aggregation 结果,如:平均
>
> mean(x)
> a 2.5
> b 2.5
> c 2.5
> d 2.5
提供一些方法@@
library(magrittr)
library(data.table)
library(dplyr)
# 1.
l %>% rbindlist(.) %>% data.frame(label = l %>%
lapply(row.names) %>% do.call(c, .)) %>%
aggregate(x ~ label, ., mean)
# 2.
l %>% lapply(function(x) data.frame(label = row.names(x), x)) %>%
rbindlist(.) %>% group_by(label) %>% summarise(mean(x))
# 3.
Reduce(function(x, y) merge(x, y, by="row.names", all=FALSE) %>%
set_rownames(row.names(x)), l) %>% .[,4:7] %>% apply(1, mean)
第一种是根据原PO改的
我觉得第二种是最简单理解,也最简单写的方法XD 我比较推荐这个
第三种方法有点tricky...我觉得速度应该也不快不推荐 (慢在merge)
3/1补充第四种
library(plyr)
l %>% lapply(name_rows) %>% rbindlist(.) %>%
group_by(.rownames) %>% summarise(mean(x))
最近在看plyr的manual,发现plyr有提供直接把row.names转成col的function
这样写起来整个function更精简

Links booklink

Contact Us: admin [ a t ] ucptt.com