gpt4 book ai didi

r - 如何在R中同时合并多个data.frames和sum和average列

转载 作者:行者123 更新时间:2023-12-03 23:49:06 28 4
gpt4 key购买 nike

我有超过 20 二十个 data.frames 具有相同的列但行数不同。我的目标是通过列“名称”(这是五个名称的列表)合并 data.frames,在合并时我希望具有相同名称的行对 A 列求和,B 列求和,并得到平均值C列。

这是我目前正在做的事情。

首先,我将一次合并 2 个 data.frames。

DF <- merge(x=abc, y=def, by = "Name", all = T)

合并的 DF 看起来像这样
Name                              A.x    B.x   C.x   A.y   B.y  C.y
name1,name2,name3,name4,name5 11 24 7 NA NA NA
name1,name3,name4,name6,name7 4 8 12 3 4 7
name1,name2,name5,name6,name7 12 4 5 NA NA NA
name3,name4,name5,name6,name7 NA NA NA 15 3 28

然后我将添加这些 ifelse报表处理 NAs和非唯一行。对于非唯一行,它将为 A 添加为 B 添加,对于 C 它将获得平均值。
DF$A <- ifelse(is.na(DF$A.x), DF$A.y,
ifelse(is.na(DF$A.y), DF$A.x,
ifelse((!is.na(DF$A.x)) & (!is.na(DF$A.y)), DF$A.x + DF$A.y, 1)))
DF$B <- ifelse(is.na(DF$B.x), DF$B.y,
ifelse(is.na(DF$B.y), DF$B.x,
ifelse((!is.na(DF$B.x)) & (!is.na(DF$B.y)), DF$B.x + DF$B.y, 1)))
DF$C <- ifelse(is.na(DF$C.x), DF$C.y,
ifelse(is.na(DF$C.y), DF$C.x,
ifelse((!is.na(DF$C.x)) & (!is.na(DF$C.y)), (DF$C.x + DF$C.y)/2, 1)))

DF 现在看起来像这样
Name                            A.x  B.x  C.x  A.y  B.y  C.y   A   B   C   
name1,name2,name3,name4,name5 11 24 7 NA NA NA 11 24 7
name1,name3,name4,name6,name7 4 8 12 3 4 8 7 12 10
name1,name2,name5,name6,name7 12 4 5 NA NA NA 12 4 5
name3,name4,name5,name6,name7 NA NA NA 15 3 28 15 3 28

然后我只保留 Name 列和最后三列
merge1 <- DF[c(1,8,9,10)]

然后我对接下来的两个 data.frames 执行相同的过程并将其称为 merge2。然后我将合并merge1和merge 2。
total1 <- merge(x = merge1, y = merge2, by = "Name", all = TRUE)

我将继续一次合并两个数据帧,然后将 Totals data.frames 合并在一起,一次合并两个。我得到了我想要的最终结果,但这是一个及时的过程,而且效率不高。

我认为我可以做到的另一种方法是对所有 data.frames 进行 rbind,然后如果在 Name 列中任何行与另一行具有相同的名称列表,则创建该行,添加列 A,添加列 B并获得 C 列的平均值。但我也不知道如何做到这一点。

这是我想要的外皮示例
Name                              A     B     C
name1,name2,name3,name4,name5 11 24 7
name1,name3,name4,name6,name7 4 8 12
name1,name2,name5,name6,name7 12 4 5
name3,name4,name5,name6,name7 15 3 28
name1,name3,name4,name6,name7 3 4 8

最终结果看起来像这样
Name                              A     B     C
name1,name2,name3,name4,name5 11 24 7
name1,name3,name4,name6,name7 7 12 10
name1,name2,name5,name6,name7 12 4 5
name3,name4,name5,name6,name7 15 3 28

同样,我确信有比我目前正在做的更有效的方法来完成我想要的东西,所以任何帮助都将不胜感激。

最佳答案

我认为您的第二种方法是可行的方法,您可以使用 data.table 做到这一点。或 dplyr .

这里使用 data.table 的几个步骤.首先,如果您的数据框是 abc , def , ...
做:

DF <- do.call(rbind, list(abc,def,...))

现在您可以将它们转换为 data.table
DT <- data.table(DF)

并简单地做类似的事情
DTres <- DT[,.(A=sum(A, na.rm=T), B=sum(B, na.rm=T), C=mean(C,na.rm=T)),by=name]

仔细检查 data.table小插图以更好地了解该软件包的工作原理。

关于r - 如何在R中同时合并多个data.frames和sum和average列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35007741/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com