使用 R 中另一个数据框的条件组总和创建新列
Create new column with conditional group sums of another dataframe in 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 分别代表一个组的所有实例(df 中的 g 或 t)的 df$Number
的总和,其中 df1$Year - df$BirthYear
大于 18 且小于 21,所以基本上如果某人的年龄介于19 和 20。
g2 和 t2 表示年份差小于 19 的组中所有实例的 df$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
我知道我可以在 df1
上进行 for 循环来创建新列,但我不知道如何指定条件以获得每年的正确组总和。
我希望这个例子能清楚地说明我想要达到的目标。
我将非常感谢任何帮助,因为我真的被困在了这一点上。
如果您只想计算 2015:2020
和 BirthYear
之间的年份差异,那么您不必创建单独的数据框。也许只是
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
让我用一个例子来说明我的问题:
示例数据:
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 分别代表一个组的所有实例(df 中的 g 或 t)的 df$Number
的总和,其中 df1$Year - df$BirthYear
大于 18 且小于 21,所以基本上如果某人的年龄介于19 和 20。
g2 和 t2 表示年份差小于 19 的组中所有实例的 df$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
我知道我可以在 df1
上进行 for 循环来创建新列,但我不知道如何指定条件以获得每年的正确组总和。
我希望这个例子能清楚地说明我想要达到的目标。
我将非常感谢任何帮助,因为我真的被困在了这一点上。
如果您只想计算 2015:2020
和 BirthYear
之间的年份差异,那么您不必创建单独的数据框。也许只是
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