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 年 yearidsum 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