[英]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點的方法。
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.