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