Re: [問題] aggregation on list of data frames

看板R_Language作者 (攸藍)時間9年前 (2015/02/24 17:38), 9年前編輯推噓0(000)
留言0則, 0人參與, 最新討論串3/3 (看更多)
> [問題敘述]: > > 有個 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更精簡 -- ※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 111.83.164.34 ※ 文章網址: https://www.ptt.cc/bbs/R_Language/M.1424770684.A.356.html ※ 編輯: celestialgod (36.235.152.127), 03/01/2015 09:52:12
文章代碼(AID): #1Kx4PyDM (R_Language)
文章代碼(AID): #1Kx4PyDM (R_Language)