[英]split list of data frames by group, apply function, combine into list
我有一個數據幀列表,每個數據幀都有一個唯一的名稱,可用於查找其組標識。 我想按組標識拆分此列表,將每個組中的數據幀平均,然后將其全部返回到按組重命名的數據幀列表中。 以下代碼可以實現我想要的功能,但是我感覺它使用了太多的“層”功能。 除了用'plyr'打擊列表直到完成為止,必須有一個更簡單/更快/更優雅的解決方案(bwahaha)。
l<-list(a.txt=data.frame(x=c(1,4), y=c(5,5)),
b.txt=data.frame(x=c(5,3), y=c(4,5)),
c.txt=data.frame(x=c(1,1), y=c(6,2)),
d.txt=data.frame(x=c(9,9), y=c(4,1)))
e<-data.frame(ID=c("a","b","c","d"), Grp=c("amb","amb","sam","sam"))
f<-unique(e$Grp)
new_l<-llply(seq_along(f), function(x,n,i){as.data.frame(
aaply(laply(x[paste(e$ID[e$Grp%in%n[i]],".txt", sep="")], as.matrix),
c(2,3), mean))}, x=l, n=f)
names(new_l)<-gids
如果已解決此問題,請指向正確的方向,因為我找不到它。
用Grp拆分ID,然后為每組ID獲取l的相應分量並取其平均值。
Mean <- function(x) Reduce("+", x) / length(x)
tapply(e$ID, e$Grp, function(id) Mean(l[paste0(id, ".txt")]))
給予:
$amb
x y
1 3.0 4.5
2 3.5 5.0
$sam
x y
1 5 5.0
2 5 1.5
注意:如果知道ID恰好與l的分量對齊,則可以進行簡化。 在這種情況下,可以在e $ Grp上拆分l:
tapply(l, e$Grp, Mean)
如果我正確理解了您的問題,則以下方法應該有效。 這也假設您的e
數據框的順序與l
個數據框列表的順序相同。 否則,我可以編輯解決方案以滿足您的需求。
res <- lapply(1:length(f),function(m) Reduce('+',l[e$Grp==f[m]])/length(l[e$Grp==f[m]]))
names(res) <- f
$amb
x y
1 3.0 4.5
2 3.5 5.0
$sam
x y
1 5 5.0
2 5 1.5
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.