使用dplyr进行交互的频率计数,必须包括零计数

Mar*_*son 10 interaction r frequency large-data dplyr

我的问题涉及使用R中的dplyr包编写代码

我有一个相对较大的数据帧(大约500万行),有2列:第一列有个人标识符(id),第二列有日期(date).目前,每行表示日期列中日期上发生的操作(由id列中的个人采取).大约有300,000个独特个体,大约2600个独特日期.例如,数据的开头如下所示:

    id         date
    John12     2006-08-03
    Tom2993    2008-10-11
    Lisa825    2009-07-03
    Tom2993    2008-06-12
    Andrew13   2007-09-11
Run Code Online (Sandbox Code Playgroud)

我想重新整形数据,以便每个可能的idx date对都有一行,另外一列计算在给定日期列出的个体发生的事件总数(可能取值0).

我在dplyr包中取得了一些成功,我用它来表示在数据中观察到的id x日期计数.

这是我到目前为止用于制表idx date计数的代码:(我的数据框称为df)

reduced = df %.% 
  group_by(id, date) %.%
  summarize(length(date))
Run Code Online (Sandbox Code Playgroud)

我的问题是(正如我上面所说)我想要一个数据集,其中包含0个没有任何关联动作的id x日期对.例如,如果在2007-10-10没有观察到John12的动作,我希望输出为该idx date对返回一行,计数为0.

我考虑在上面创建框架,然后使用空框架进行合并,但我确信必须有一个更简单的解决方案.任何建议非常感谢!

edd*_*ddi 6

这是一个简单的选项,使用data.table:

library(data.table)

dt = as.data.table(your_df)

setkey(dt, id, date)

# in versions 1.9.3+
dt[CJ(unique(id), unique(date)), .N, by = .EACHI]
#          id       date N
# 1: Andrew13 2006-08-03 0
# 2: Andrew13 2007-09-11 1
# 3: Andrew13 2008-06-12 0
# 4: Andrew13 2008-10-11 0
# 5: Andrew13 2009-07-03 0
# 6:   John12 2006-08-03 1
# 7:   John12 2007-09-11 0
# 8:   John12 2008-06-12 0
# 9:   John12 2008-10-11 0
#10:   John12 2009-07-03 0
#11:  Lisa825 2006-08-03 0
#12:  Lisa825 2007-09-11 0
#13:  Lisa825 2008-06-12 0
#14:  Lisa825 2008-10-11 0
#15:  Lisa825 2009-07-03 1
#16:  Tom2993 2006-08-03 0
#17:  Tom2993 2007-09-11 0
#18:  Tom2993 2008-06-12 1
#19:  Tom2993 2008-10-11 1
#20:  Tom2993 2009-07-03 0
Run Code Online (Sandbox Code Playgroud)

在1.9.2版本中或等效表达式之前省略显式by:

dt[CJ(unique(id), unique(date)), .N]
Run Code Online (Sandbox Code Playgroud)

我们的想法是创建所有可能的对iddate(这是CJ部件所做的),然后合并它,计算出现次数.

  • @ D8Amonk那不是真的 (2认同)