首页 > 解决方案 > 使用 R 中另一个数据框的条件组总和创建新列

问题描述

让我用一个例子来说明我的问题:

样本数据:

df<-data.frame(BirthYear = c(1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005), Number= c(1,1,1,1,1,1,1,1,1,1,1), Group = c("g", "g", "g", "g", "g", "g","t","t","t","t","t"))

df 
 BirthYear Number  Group 
1  1995     1       g
2  1996     1       g 
3  1997     1       g
4  1998     1       g
5  1999     1       g
6  2000     1       g
7  2001     1       t
8  2002     1       t
9  2003     1       t
10 2004     1       t
11 2005     1       t 

df1<- structure(list(Year = c(2015, 2016, 2017, 2018, 2019, 2020)), class = "data.frame", row.names = c(NA, 
-6L))

df1
   Year
1  2015
2  2016
3  2017
4  2018 
5  2019
6  2020

现在我想将新列添加到df1:g1、g2、t1 和 t2。g1 和 t1 分别表示大于 18 且小于 21df$Number的组(df 中的 g 或 t)的所有实例的总和,因此基本上如果某人的年龄在 19 和 20 之间。g2 和 t2 表示总和年差小于 19 的组的所有实例df1$Year - df$BirthYeardf$Number

我想结束以下内容:

df1
   Year   g1   g2  t1   t2 
1  2015   2    4    0    5
2  2016   2    3    0    5
3  2017   2    2    0    5
4  2018   2    1    0    5
5  2019   2    0    0    5
6  2020   1    0    1    4

我知道我可以进行一个 for 循环df1来创建新列,但我不知道如何指定条件以获取每年的正确组总和。我希望这个例子能清楚地说明我想要达到的目标。我会非常感谢任何帮助,因为我真的被困在这一点上。

标签: rloopssumconditional-statementsgrouping

解决方案


如果您只想计算 和 之间的年份差异2015:2020BirthYear那么您不必创建单独的数据框。也许只是

library(tidyr)
library(dplyr)
df %>% 
  expand(Year = 2015:2020, nesting(BirthYear, Number, Group)) %>% 
  group_by(Year, Group) %>% 
  summarise(
    `1` = sum(between(Year - BirthYear, 19, 20) * Number), 
    `2` = sum((Year - BirthYear < 19) * Number)
  ) %>% 
  pivot_wider(names_from = "Group", values_from = c("1", "2"), names_glue = "{Group}{.value}")

输出

`summarise()` regrouping output by 'Year' (override with `.groups` argument)
# A tibble: 6 x 5
# Groups:   Year [6]
   Year    g1    t1    g2    t2
  <int> <dbl> <dbl> <dbl> <dbl>
1  2015     2     0     4     5
2  2016     2     0     3     5
3  2017     2     0     2     5
4  2018     2     0     1     5
5  2019     2     0     0     5
6  2020     1     1     0     4

推荐阅读