r - 使用 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$BirthYear
。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
我知道我可以进行一个 for 循环df1
来创建新列,但我不知道如何指定条件以获取每年的正确组总和。我希望这个例子能清楚地说明我想要达到的目标。我会非常感谢任何帮助,因为我真的被困在这一点上。
解决方案
如果您只想计算 和 之间的年份差异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
推荐阅读
- javascript - React - 仅在状态更改后才做某事(钩子)
- node.js - Firebase PubSub 函数需要 2 多分钟才能响应
- iokit - 程序未在 Big Sur 上运行 - 适用于所有 10.xx
- html - 表格可以在引导模式内滚动,但现在表格条目宽度不同
- scala - 在 Scala 对象中定义的范围字段的最佳实践
- css - 行的 Flexbox 布局问题
- python - python pandas datafream to_csv 索引
- javascript - 如何使用更改背景的 ForEach 按钮?
- swiftui - SwiftUI:旋转后文本没有屏幕的全宽
- google-apps-script - 如何从 Google 表格中获取数据并将其显示在 Google 表单上?