【发布时间】: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 点的方法。
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