如何对一个数据框中的列值求和并将结果添加为另一个数据框中的列?
Posted
技术标签:
【中文标题】如何对一个数据框中的列值求和并将结果添加为另一个数据框中的列?【英文标题】:How to sum values of column in one data frame and add results as a column in another data frame? 【发布时间】:2021-08-19 23:41:10 【问题描述】:我的主要数据框的一个例子是这样的:
Group | Additional Data | Additional Data |
---|---|---|
1 | ... | ... |
2 | ... | ... |
3 | ... | ... |
我有第二个数据框,如下所示:
Name | Group | Score |
---|---|---|
A | 1 | 10 |
B | 2 | 5 |
C | 3 | 7 |
D | 1 | 7 |
E | 2 | 10 |
F | 3 | 9 |
G | 1 | 8 |
H | 2 | 3 |
I | 3 | 8 |
我的目标和期望的输出将是第一个数据框,该数据框带有一个附加列,该列将每个成员在每个相应组中的分数相加,+ 一个附加列,该列取每个组的总分并增加 5 分(见下文) :
Group | Additional Data | Additional Data | Raw Score | Total Score (with bonus) |
---|---|---|---|---|
1 | ... | ... | 25 | 30 |
2 | ... | ... | 18 | 23 |
3 | ... | ... | 24 | 29 |
我无法找到一种方法来进行条件求和,然后将这些值附加到我的原始数据框中。我想我知道如何创建一个将原始分数加 5 的列,但我无法获得汇总的原始数据数字。
【问题讨论】:
【参考方案1】: merge(df1, aggregate(Score~Group, df2, sum), all.x = TRUE, by = 'Group')
【讨论】:
【参考方案2】:第一组df2
,然后是summarise
,然后是left_join
。
我用字母代替了点:
library(dplyr)
df2 <- df2 %>%
group_by(Group) %>%
summarise(`Raw Score` = sum(Score),
`Total Score (with bonus)`= sum(Score)+5
)
df1 <- df1 %>%
left_join(df2, by="Group")
输出:
Group Additional_Data Additional_Data_1 `Raw Score` `Total Score (with bonus)`
<dbl> <chr> <chr> <dbl> <dbl>
1 1 AA FF 25 30
2 2 BB EE 18 23
3 3 CC DD 24 29
【讨论】:
【参考方案3】:我试图复制你想要的。
library(data.table)
# Replicates your main dataframe
group <- c(1, 2, 3)
additional_data <- c(rep(NA))
additional_data2 <- c(rep(NA))
main <- setDT(data.frame(group, additional_data, additional_data2)) # setDT makes it a data.table and data.frame format
# Replicates your second dataframe
name <- c("A", "B", "C", "D", "E", "F", "G", "H", "I")
group <- c(1, 2, 3, 1, 2, 3, 1, 2, 3)
score <- c(10, 5, 7, 7, 10, 9, 8, 3, 8)
data <- setDT(data.frame(name, group, score))
# Use data.table to create your columns (dplyr might be easier for you)
data[, raw_score := sum(score), by = c("group")]
data[, total_score := raw_score + 5]
# Only takes unique "group" values and removes name and score
data <- unique(data, by = c("group"))[, c("name", "score") := NULL]
# Final output (merges your second data w/ first data by group)
data_final <- merge(main, data, all.x = TRUE, by = c("group"))
最终输出:
group additional_data additional_data2 raw_score total_score
1: 1 NA NA 25 30
2: 2 NA NA 18 23
3: 3 NA NA 24 29
【讨论】:
以上是关于如何对一个数据框中的列值求和并将结果添加为另一个数据框中的列?的主要内容,如果未能解决你的问题,请参考以下文章