R:根据之前的数据和id动态聚合

时间:2014-12-16 18:16:14

标签: r aggregate stata

我有一个非常大的数据集,看起来简化如下:

row.    member_id   entry_id    comment_count   timestamp
1       1            a              4           2008-06-09 12:41:00
2       1            b              1           2008-07-14 18:41:00
3       1            c              3           2008-07-17 15:40:00
4       2            d              12          2008-06-09 12:41:00
5       2            e              50          2008-09-18 10:22:00
6       3            f              0           2008-10-03 13:36:00

我现在想要创建一个新列,其中我总结了所有" commen_count"以前的想法(" ID")来自同一个成员。所以我只想总结在当前条目之前发生的被委托的comment_counts。我可以通过成员ID和时间戳来订购我的数据集。

结果应如下所示:

row.    member_id   entry_id    comments_count  timestamp             aggregated_count
1       1            a              4           2008-06-09 12:41:00        4
2       1            b              1           2008-07-14 18:41:00        5
3       1            c              3           2008-07-17 15:40:00        8
4       2            d              12          2008-06-09 12:41:00        12
5       2            e              50          2008-09-18 10:22:00        62
6       3            f              0           2008-10-03 13:36:00        0

有些想法我怎么能在R(或Stata)中做到这一点?我尝试了聚合,但我不明白如何只在当前时间戳之前加上comment_counts,而只是那些与当前member_id相加的那些。

2 个答案:

答案 0 :(得分:2)

试试这个(假设df是你的数据)

transform(df, aggregated_count = ave(comments_count, member_id, FUN = cumsum))
#   member_id entry_id comments_count           timestamp aggregated_count
# 1         1        a              4 2008-06-09 12:41:00                4
# 2         1        b              1 2008-07-14 18:41:00                5
# 3         1        c              3 2008-07-17 15:40:00                8
# 4         2        d             12 2008-06-09 12:41:00               12
# 5         2        e             50 2008-09-18 10:22:00               62
# 6         3        f              0 2008-10-03 13:36:00                0

其他一些方法(为提高效率而引入):

library(data.table)
setDT(df)[, aggregated_count := cumsum(comments_count), member_id]

或者

library(dplyr)
df %>%
  group_by(member_id) %>%
  mutate(aggregated_count = cumsum(comments_count))

答案 1 :(得分:2)

Stata:

clear
set more off

*----- example data -----

input ///
row    member_id   str1 entry_id    comment_count   str30 timestamp
1       1            a              4           2008-06-09 12:41:00
2       1            b              1           2008-07-14 18:41:00
3       1            c              3           2008-07-17 15:40:00
4       2            d              12          2008-06-09 12:41:00
5       2            e              50          2008-09-18 10:22:00
6       3            f              0           2008-10-03 13:36:00
end

list

*----- what you want -----

bysort member_id: gen s = sum(comment_count)

list

这只涉及使用by:前缀。