簡體   English   中英

按組划分數據幀列表,應用功能,合並為列表

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM