R中2个标准的累计总和

Cumulative sum for 2 criteria in R

我有一个数据库,我想在其中计算 2 个条件的累计总和

dfdata = data.frame(car = c("toyota","toyota","toyota","toyota","toyota",
                            "honda","honda","honda","honda",
                            "lada","lada","lada","lada"),
                    year = c(2000,2000,2001,2001,2002,2001,2001,2002,2002,2003,2004,2005,2006),
                    id = c("a","b","a","c","a","d","d","d","e","f","f","f","f"))

可以往下看数据:

dfdata
      car year id
1  toyota 2000  a
2  toyota 2000  b
3  toyota 2001  a
4  toyota 2001  c
5  toyota 2002  a
6   honda 2001  d
7   honda 2001  d
8   honda 2002  d
9   honda 2002  e
10   lada 2003  f
11   lada 2004  f
12   lada 2005  f
13   lada 2006  f

想象一下,我正在观察经过的汽车,上面的车牌是 "ID"。因此,具有相同 ID 的汽车是完全相同的汽车。

  1. 我要一年内见过的车企总和
  2. 我要
  3. 见过的车企累计数
  4. 我要的是我不止一次看过的汽车公司的累计总和(算上我在同一年和其他年份看过的和另一列算上我在其他年份只看过的)

这是我得到第 1 点和第 2 点的方法。

dfdata %>%  
  group_by(car, year) %>% 
  dplyr::summarise(nb = n())  %>% 
  dplyr::mutate(cs = cumsum(nb)) %>% 
  ungroup()

nb 是我在特定年份看到的某个制造商的汽车数量。 cs 是这些年来汽车的累计总和。

# A tibble: 9 x 4
  car     year    nb    cs
  <fct>  <dbl> <int> <int>
1 honda   2001     2     2
2 honda   2002     2     4
3 lada    2003     1     1
4 lada    2004     1     2
5 lada    2005     1     3
6 lada    2006     1     4
7 toyota  2000     2     2
8 toyota  2001     2     4
9 toyota  2002     1     5

但是请注意,我丢失了 ID 列。如何获取同一个ID多次看到的车数

最终输出应基于分组 ID(回答第 3 点):

     car year nb cs curetrap curetrap.no.same.year
1  honda 2001  2  2        1                     0
2  honda 2002  2  4        2                     1
3   lada 2003  1  1        0                     0
4   lada 2004  1  2        1                     1
5   lada 2005  1  3        2                     2
6   lada 2006  1  4        3                     3
7 toyota 2000  2  2        0                     0
8 toyota 2001  2  4        1                     1
9 toyota 2002  1  5        2                     2

这是因为"honda"在2001年出现过2次,2002年出现过2次,所以2001年的累计和是2次,2002年是2+2次。那么,在同年 我看过本田 "d" 两次,这意味着我 "recaptured" "d" 2001 本田因此是 2001 年 curetrap 中的“1”。2002 年,我又夺回了本田"d",因此累计金额增加了。 "curetrap.no.same.year" 是同一回事,但我想忽略 2001 年本田 "d" 的夺回,因为它是同一年。

这怎么可能?由于我丢失了 ID 信息,是否需要分两步完成?

到目前为止,这是我所拥有的:

tab.df = cbind(table(dfdata$id,dfdata$year),
      car = as.character(dfdata[match(unique(dfdata$id),table = dfdata$id),"car"]))
df.df = as.data.frame(tab.df)

  2000 2001 2002 2003 2004 2005 2006    car
a    1    1    1    0    0    0    0 toyota
b    1    0    0    0    0    0    0 toyota
c    0    1    0    0    0    0    0 toyota
d    0    2    1    0    0    0    0  honda
e    0    0    1    0    0    0    0  honda
f    0    0    0    1    1    1    1   lada

这显示了我在一年内看到某个 ID 的汽车的所有次数。

您可以将问题分解为 2 个步骤,首先在您的原始数据集中添加二进制变量来标记您要计数的记录,然后简单地计算这些标记的总和和 cumsum。

下面的代码给出了你想要的结果

dfdata %>% 
  group_by(car, id) %>% 
  arrange(year, .by_group=TRUE) %>% 
  dplyr::mutate(already_seen = row_number()>1, already_seen_diff_year = year>year[1])  %>% 
  group_by(car, year) %>% 
  dplyr::summarise(nb = n(), cs = nb, curetrap = sum(already_seen), curetrap.no.same.year = sum(already_seen_diff_year))  %>% 
  dplyr::mutate_at(vars(cs, curetrap, curetrap.no.same.year), cumsum) %>% 
  ungroup()

注意:复制变量 cs = nb 只是一个技巧,可以轻松编写对 mutate_at

的后续调用