R 中的 sumifs 和 countifs 等效
sumifs and countifs equivalent in R
伙计们
假设我有一个如下所示的数据集:
id value year total_value total_frequency
1 10 2019 44 4
1 15 2019 44 4
1 12 2020 44 4
1 7 2020 44 4
2 10 2019 28 2
2 18 2020 28 2
3 27 2019 27 1
我打算实现这样的形式:
id value year total_value total_frequency 2020_value 2020_frequency
1 10 2019 44 4 19 2
1 15 2019 44 4 19 2
1 12 2020 44 4 19 2
1 7 2020 44 4 19 2
2 10 2019 28 2 18 1
2 18 2020 28 2 18 1
3 27 2019 27 1 0 0
以后的步骤需要重复。
我可以通过 Excel 使用 sumifs() 和 countifs() 轻松实现这种形式,但无法在 R 中获得相同的结果。
我想我可以使用 dplyr
包来做到这一点,但不知道具体如何,因此需要一些建议。
将 2020 年 year
的 id
和 sum
value
分组,并计算它的行数。
library(dplyr)
df %>%
group_by(id) %>%
mutate(value_2020 = sum(value[year %in% 2020]),
frequency_2020 = sum(year %in% 2020)) %>%
ungroup
# id value year total_value total_frequency value_2020 frequency_2020
# <int> <int> <int> <int> <int> <int> <int>
#1 1 10 2019 44 4 19 2
#2 1 15 2019 44 4 19 2
#3 1 12 2020 44 4 19 2
#4 1 7 2020 44 4 19 2
#5 2 10 2019 28 2 18 1
#6 2 18 2020 28 2 18 1
#7 3 27 2019 27 1 0 0
使用data.table
library(data.table)
setDT(df1)[, c('value_2020', 'frequency_2020') := {i1 <- year %in% 2020
.(sum(value[i1]), sum(i1))}, id]
-输出
df1
id value year total_value total_frequency value_2020 frequency_2020
1: 1 10 2019 44 4 19 2
2: 1 15 2019 44 4 19 2
3: 1 12 2020 44 4 19 2
4: 1 7 2020 44 4 19 2
5: 2 10 2019 28 2 18 1
6: 2 18 2020 28 2 18 1
7: 3 27 2019 27 1 0 0
使用 tapply
的基础 R 选项
transform(
df,
value_2020 = tapply(value, list(year, id), sum)["2020", ][id],
frequency_2020 = tapply(year == 2020, list(year, id), sum)["2020", ][id]
)
给予
id value year total_value total_frequency value_2020 frequency_2020
1 1 10 2019 44 4 19 2
2 1 15 2019 44 4 19 2
3 1 12 2020 44 4 19 2
4 1 7 2020 44 4 19 2
5 2 10 2019 28 2 18 1
6 2 18 2020 28 2 18 1
7 3 27 2019 27 1 NA NA
伙计们
假设我有一个如下所示的数据集:
id value year total_value total_frequency
1 10 2019 44 4
1 15 2019 44 4
1 12 2020 44 4
1 7 2020 44 4
2 10 2019 28 2
2 18 2020 28 2
3 27 2019 27 1
我打算实现这样的形式:
id value year total_value total_frequency 2020_value 2020_frequency
1 10 2019 44 4 19 2
1 15 2019 44 4 19 2
1 12 2020 44 4 19 2
1 7 2020 44 4 19 2
2 10 2019 28 2 18 1
2 18 2020 28 2 18 1
3 27 2019 27 1 0 0
以后的步骤需要重复。
我可以通过 Excel 使用 sumifs() 和 countifs() 轻松实现这种形式,但无法在 R 中获得相同的结果。
我想我可以使用 dplyr
包来做到这一点,但不知道具体如何,因此需要一些建议。
将 2020 年 year
的 id
和 sum
value
分组,并计算它的行数。
library(dplyr)
df %>%
group_by(id) %>%
mutate(value_2020 = sum(value[year %in% 2020]),
frequency_2020 = sum(year %in% 2020)) %>%
ungroup
# id value year total_value total_frequency value_2020 frequency_2020
# <int> <int> <int> <int> <int> <int> <int>
#1 1 10 2019 44 4 19 2
#2 1 15 2019 44 4 19 2
#3 1 12 2020 44 4 19 2
#4 1 7 2020 44 4 19 2
#5 2 10 2019 28 2 18 1
#6 2 18 2020 28 2 18 1
#7 3 27 2019 27 1 0 0
使用data.table
library(data.table)
setDT(df1)[, c('value_2020', 'frequency_2020') := {i1 <- year %in% 2020
.(sum(value[i1]), sum(i1))}, id]
-输出
df1
id value year total_value total_frequency value_2020 frequency_2020
1: 1 10 2019 44 4 19 2
2: 1 15 2019 44 4 19 2
3: 1 12 2020 44 4 19 2
4: 1 7 2020 44 4 19 2
5: 2 10 2019 28 2 18 1
6: 2 18 2020 28 2 18 1
7: 3 27 2019 27 1 0 0
使用 tapply
transform(
df,
value_2020 = tapply(value, list(year, id), sum)["2020", ][id],
frequency_2020 = tapply(year == 2020, list(year, id), sum)["2020", ][id]
)
给予
id value year total_value total_frequency value_2020 frequency_2020
1 1 10 2019 44 4 19 2
2 1 15 2019 44 4 19 2
3 1 12 2020 44 4 19 2
4 1 7 2020 44 4 19 2
5 2 10 2019 28 2 18 1
6 2 18 2020 28 2 18 1
7 3 27 2019 27 1 NA NA