簡體   English   中英

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. 我想要我已經看過不止一次的汽車公司的累計總和(算出我在同一年和其他年份見過的汽車公司,以及另一列統計我在過去幾年中只見過的汽車公司)

這就是我得到第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次。所以累計總和在2001年為2,在2002年為2 +2。然后, 在同一年內,我兩次看到本田“ d” ,這意味着我“重新捕獲”了2001年的“ d”本田,因此在2001年的捕捉器中“捕獲了”“ 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個步驟,首先在原始數據集中添加二進制變量,該變量將標記要計數的記錄,然后簡單地計算這些標記的總和。

以下代碼給出了想要的結果

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的后續調用

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM