按组拆分数据框列表,应用功能,组合成列表
split list of data frames by group, apply function, combine into list
我有一个数据框列表,每个数据框都有一个唯一的名称,可用于查找其组标识。我想按组身份拆分此列表,对每个组中的数据帧进行平均,然后 return 将其全部放入按组重命名的数据帧列表中。下面的代码做了我想要的,但我觉得它使用了太多 'ply' 函数。必须有一个更简单/更快/更优雅的解决方案,而不是用 'plyr' 抨击列表直到它 comPLYes (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
如果有人回答了这个问题,请指出正确的方向,因为我找不到它。
如果我正确理解您的问题,则以下内容应该有效。这还假设您的 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
按 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)
我有一个数据框列表,每个数据框都有一个唯一的名称,可用于查找其组标识。我想按组身份拆分此列表,对每个组中的数据帧进行平均,然后 return 将其全部放入按组重命名的数据帧列表中。下面的代码做了我想要的,但我觉得它使用了太多 'ply' 函数。必须有一个更简单/更快/更优雅的解决方案,而不是用 'plyr' 抨击列表直到它 comPLYes (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
如果有人回答了这个问题,请指出正确的方向,因为我找不到它。
如果我正确理解您的问题,则以下内容应该有效。这还假设您的 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
按 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:
上拆分 ltapply(l, e$Grp, Mean)