如何对一个数据框中的列值求和并将结果添加为另一个数据框中的列?

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

【讨论】:

以上是关于如何对一个数据框中的列值求和并将结果添加为另一个数据框中的列?的主要内容,如果未能解决你的问题,请参考以下文章

计算由另一列值分组的列值在 pandas 数据框中的共现

微软访问报表汇总功能

对数据框中的一列求和并将结果返回为 int

Webi - 当另一列值为空时隐藏中断中的列

如何使用 mySQL 返回另一列中每个值的最常见列值?

根据另一列值更新数据框的列