首页 > 解决方案 > dplyr中的条件求和

问题描述

我有以下数据框:

df <- structure(list(Claim2015 = c(1, 1, 1, 1, 1, 1, 1, 1, 1,
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1), Claim2016 = c(1, 0, 1,
1, 1, 0, 1, 1, 0, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 0), Claim2017 = c(0,
0, 1, 1, 1, 0, 0, 1, 0, 1, 1, 1, 0, 1, 1, 0, 0, 0, 1, 1), Claim2018 = c(0,
1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 1, 0, 1, 1, 0, 0, 0, 0, 1), Claim2019 = c(0,
0, 0, 0, 1, 0, 0, 0, 0, 1, 1, 1, 0, 1, 0, 0, 0, 1, 0, 0)), row.names = c(NA,
-20L), class = c("tbl_df", "tbl", "data.frame"))

我想创建一个有条件的总和,即在 2015 年提出索赔的人中,有多少人在 2016 年提出;在两者中,2017 年有多少人等等(总和会减少)。

所以预期的输出是:

 db <- data_frame(Had2015 = 20, Had2016 = 15, Had2017 = 9, Had2018 = 7, Had2019 = 5)

我开始做的是

df1 <- df %>% group_by_all %>% count

这以一种更容易计数的方式组织输出 - 所以我n对那些有 1 的人、那些有 1 和 1 的人、那些有 1 和 1 和 1 的人等进行求和 - 只是不知道该怎么做这是自动的。

任何帮助,将不胜感激。

标签: rdplyr

解决方案


使用基数 R,我们可以递增地遍历每一列并计算全为 1 的行数。

sapply(seq_along(df), function(x) sum(rowSums(df[1:x] == 1) == x))
#[1] 20 15  9  7  5

推荐阅读