【发布时间】:2017-09-10 15:27:54
【问题描述】:
我有一个很长的数据框,或多或少具有以下结构:
df <- data.frame(
dates = c("2011-10-01","2011-10-01","2011-10-01","2011-10-02","2011-10-03","2011-10-05","2011-10-06","2011-10-06"),
ids = c("A","A","B","C","D","A","E","D"),
values = c(10,1,25,2,5,10,4,1))
> df
dates ids values
1 2011-10-01 A 10
2 2011-10-01 A 1
3 2011-10-01 B 25
4 2011-10-02 C 2
5 2011-10-03 D 5
6 2011-10-05 A 10
7 2011-10-06 E 4
8 2011-10-06 D 1
我想得到以下输出:
dates unique_ids sum_values
1 2011-10-01 2 36
2 2011-10-02 3 38
3 2011-10-03 4 43
4 2011-10-04 4 43
5 2011-10-05 4 53
6 2011-10-06 5 58
即对于每个日期,unique_ids 给出了与较早日期对应的唯一 ID 的数量,而 sum_values 给出了与较早日期对应的值的总和。
我绝对想避免循环,因为原始 df 太大了。所以我在考虑使用 dplyr。
我知道如何获取 sum_value
df %>%
group_by(dates) %>%
summarize(sum_values_daily = sum(values)) %>%
mutate(sum_values = cumsum(sum_values_daily)) %>%
select(dates, sum_values)
我不知道如何获取 unique_ids 列。
有什么想法吗?
【问题讨论】:
-
df %>% group_by(dates) %>% summarise(unique_ids = n_distinct(ids), sum_values = sum(values)) -
嗨,Ronak,你的建议不是想要的结果,我想要某个日期的 uniques_ids 之前所有日期的唯一 id 的数量,以及对应于之前的值的总和日期。
-
请仔细检查您的预期输出,我认为它不正确。
-
mtoto 我认为它是正确的,但没有明确解释。 id 的唯一编号是 2,并且 2011-10-01 的所有值的总和是 36,但您不仅要添加唯一 id #s 的值。
-
@mtoto 所需的输出是正确的。我不想要一个简单的 df %>% group_by(date) %>% summarise(unique_ids=n_distinct(ids), sum_values = sum(values))