连接两个表时在 R 中获取加权平均值
Getting a weighted average in R when joining two tables
对于这个问题的任何令人困惑的and/or,我只是提前道歉。我是 R 的新手,但由于较大的项目限制,我目前被迫将其用于此任务。
现在我有两个 table 想加入,RMS1 和 RMS2。
RMS1 更大,我只想继承 RMS2 的匹配列(左连接)。在大多数情况下,RMS1 和 RMS2 是单独的数据集,每个条目都有一个唯一的 ID,但是两个 table 之间有一些重叠的 ID,在这种情况下,我想得到一个加权平均值当我进行连接时,它们共有的列数。
例如,我在两个 table 中都有列 (ID, sev1, freq1, score1, count1),如果两个 table 中有两个相同的 ID,则计数会有所不同,所以我想要一个新的 table,其中包含基于计数的 sev1、freq1 和 score1 的加权平均值。
我发现了这个 old question,我可能可以为我工作,但是因为我需要做这个计算 13*3 次而且我对 R 中的向量没有任何经验,我想我会询问并查看是否有更有效的方法来获得我想要的东西。
基本上,在一天结束时,我希望制作一个新的 table,其中所有列与 RMS1 完全相同,但 sev1、freq1、score1 等是加权平均值,如果必要的。
编辑:糟糕,看来我想要一个完整的加入。不过,在这个问题的上下文中并不重要,我假设我可以稍后调整连接的类型,我只需要知道如何进行加权平均。
我想为了更清楚,我将写一个简化的 table 示例:
RMS1: id freq1 sev1 score1 count1
W123 1 5 3 40
F456 2 2 4 55
Y789 0 3 6 25
RMS2: id freq1 sev1 score1 count1
S012 3 3 6 25
Y789 3 0 3 50
Joined: id freq1 sev1 score1
W123 1 5 3
F456 2 2 4
Y789 2* 1* 4*
S012 3 3 6
所以带星号的值是 id Y789 的加权平均值(按计数加权),因为它出现在两个 RMS table 中。否则我只是从 table 中获取原始值。希望这可以帮助。再次提醒大家,对于格式不正确,我们深表歉意。
使用 dplyr 的解决方案。我们可以将两个数据框按行合并,然后按每个 id
计算加权平均值。如果您可以在 tibble
.
上工作,则不需要最后一个 as.data.frame()
library(dplyr)
Joined <- bind_rows(RMS1, RMS2) %>%
group_by(id) %>%
summarise_at(vars(-count1), funs(weighted.mean(., count1))) %>%
as.data.frame()
Joined
# id freq1 sev1 score1
# 1 F456 2 2 4
# 2 S012 3 3 6
# 3 W123 1 5 3
# 4 Y789 2 1 4
数据
RMS1 <- read.table(text = "id freq1 sev1 score1 count1
W123 1 5 3 40
F456 2 2 4 55
Y789 0 3 6 25",
header = TRUE, stringsAsFactors = FALSE)
RMS2 <- read.table(text = "id freq1 sev1 score1 count1
S012 3 3 6 25
Y789 3 0 3 50",
header = TRUE, stringsAsFactors = FALSE)
对于这个问题的任何令人困惑的and/or,我只是提前道歉。我是 R 的新手,但由于较大的项目限制,我目前被迫将其用于此任务。
现在我有两个 table 想加入,RMS1 和 RMS2。 RMS1 更大,我只想继承 RMS2 的匹配列(左连接)。在大多数情况下,RMS1 和 RMS2 是单独的数据集,每个条目都有一个唯一的 ID,但是两个 table 之间有一些重叠的 ID,在这种情况下,我想得到一个加权平均值当我进行连接时,它们共有的列数。
例如,我在两个 table 中都有列 (ID, sev1, freq1, score1, count1),如果两个 table 中有两个相同的 ID,则计数会有所不同,所以我想要一个新的 table,其中包含基于计数的 sev1、freq1 和 score1 的加权平均值。
我发现了这个 old question,我可能可以为我工作,但是因为我需要做这个计算 13*3 次而且我对 R 中的向量没有任何经验,我想我会询问并查看是否有更有效的方法来获得我想要的东西。
基本上,在一天结束时,我希望制作一个新的 table,其中所有列与 RMS1 完全相同,但 sev1、freq1、score1 等是加权平均值,如果必要的。
编辑:糟糕,看来我想要一个完整的加入。不过,在这个问题的上下文中并不重要,我假设我可以稍后调整连接的类型,我只需要知道如何进行加权平均。 我想为了更清楚,我将写一个简化的 table 示例:
RMS1: id freq1 sev1 score1 count1
W123 1 5 3 40
F456 2 2 4 55
Y789 0 3 6 25
RMS2: id freq1 sev1 score1 count1
S012 3 3 6 25
Y789 3 0 3 50
Joined: id freq1 sev1 score1
W123 1 5 3
F456 2 2 4
Y789 2* 1* 4*
S012 3 3 6
所以带星号的值是 id Y789 的加权平均值(按计数加权),因为它出现在两个 RMS table 中。否则我只是从 table 中获取原始值。希望这可以帮助。再次提醒大家,对于格式不正确,我们深表歉意。
使用 dplyr 的解决方案。我们可以将两个数据框按行合并,然后按每个 id
计算加权平均值。如果您可以在 tibble
.
as.data.frame()
library(dplyr)
Joined <- bind_rows(RMS1, RMS2) %>%
group_by(id) %>%
summarise_at(vars(-count1), funs(weighted.mean(., count1))) %>%
as.data.frame()
Joined
# id freq1 sev1 score1
# 1 F456 2 2 4
# 2 S012 3 3 6
# 3 W123 1 5 3
# 4 Y789 2 1 4
数据
RMS1 <- read.table(text = "id freq1 sev1 score1 count1
W123 1 5 3 40
F456 2 2 4 55
Y789 0 3 6 25",
header = TRUE, stringsAsFactors = FALSE)
RMS2 <- read.table(text = "id freq1 sev1 score1 count1
S012 3 3 6 25
Y789 3 0 3 50",
header = TRUE, stringsAsFactors = FALSE)