【问题标题】:Cumulative sum for 2 criteria in RR中2个标准的累积和
【发布时间】:2019-03-13 16:07:09
【问题描述】:

我有一个数据库,我想在其中计算 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. 我想要我见过不止一次的汽车公司的累计总和(计算我在同一年和其他年份见过的汽车公司以及另一列计算我见过的汽车公司) '只在其他年份见过)

这是我得到第 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

这是因为“本田”在 2001 年出现了 2 次,在 2002 年出现了 2 次。所以累计总和是 2 年 2001 年和 2 + 2 年 2002 年。那么,在同一年内我见过本田“d”两次,这意味着我“夺回”了“d”2001本田,因此2001年在curtrap中的“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 的汽车的所有次数。

【问题讨论】:

    标签: r dataframe dplyr summarization


    【解决方案1】:

    您可以将问题分解为 2 个步骤,首先在原始数据集中添加二进制变量,这些变量将标记您要计数的记录,然后简单地计算这些标记的 sum 和 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 的调用

    【讨论】:

    • 这太棒了!为此非常感谢。我想更好地理解你在做什么。这是让我明白你在说什么的代码行! dfdata %&gt;% group_by(car) %&gt;% dplyr::mutate(test = row_number())
    • 是的,很抱歉,如果这缺少一点解释,很高兴你找到它。实际上,row_number() 将对组内的记录进行编号。如果您不确定输入数据的排序,您也可以使用dfdata %&gt;% group_by(car) %&gt;% dplyr::mutate(test = row_number(year)),以便较小的年份获得较小的行号。平局是通过输入数据中的行顺序完成的。
    猜你喜欢
    • 1970-01-01
    • 2011-02-15
    • 2023-03-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-04-24
    • 2021-06-13
    相关资源
    最近更新 更多