我有一个data.table超过130 000行。通过data.table的唯一值分组
我想分组两个列:dates
和progress
由一个变量id
并将值放在一个向量中,所以我用aggregate()
。
df_agr <- aggregate(cbind(progress, dates) ~ id, data = df_test, FUN = c)
然而,它需要大约52秒汇总数据+我从山坳dates
失去的日期格式。
数据帧的一个例子:
id dates progress
1: 3505H6856 2003-07-10 yes
2: 3505H6856 2003-08-21 yes
3: 3505H6856 2003-09-04 yes
4: 3505H6856 2003-10-16 yes
5: 3505H67158 2003-01-14 yes
6: 3505H67158 2003-02-18 yes
7: 3505H67862 2003-03-06 yes
8: 3505H62168 2003-04-24 no
9: 3505H62168 2003-05-15 yes
10: 3505H65277 2003-02-11 yes
结果我得到:
id progress dates
1 3505H62168 1, 2 5, 6
2 3505H65277 2 2
3 3505H67158 2, 2 1, 3
4 3505H67862 2 4
5 3505H6856 2, 2, 2, 2 7, 8, 9, 10
我很惊讶地看到,一切都转化成谁似乎包含了“一个integer
+每行独立“载体实际上是来自列表的载体:
'data.frame': 5 obs. of 3 variables:
$ id : chr "3505H62168" "3505H65277" "3505H67158" "3505H67862" ...
$ progress:List of 5
..$ 1: int 1 2
..$ 2: int 2
..$ 3: int 2 2
..$ 4: int 2
..$ 5: int 2 2 2 2
$ dates :List of 5
..$ 1: int 5 6
..$ 2: int 2
..$ 3: int 1 3
..$ 4: int 4
..$ 5: int 7 8 9 10
我试图转换回日期以正确的格式有:
lapply(df_agr$dates, function(x) as.Date(x, origin="1970-01-01"))
但我得到:
$`1`
[1] "1970-01-06" "1970-01-07"
$`2`
[1] "1970-01-03"
$`3`
[1] "1970-01-02" "1970-01-04"
$`4`
[1] "1970-01-05"
$`5`
[1] "1970-01-08" "1970-01-09" "1970-01-10" "1970-01-11"
如此看来,因为它是写在文件中,也许是最低的起源不是"1970-01-01"
来自数据的日期?
所以我的问题是:如何获得与aggregate()
相同的结果与data.table
同时保持日期格式?
所以它意味着如何通过唯一的ID与data.table分组。我想:
setDT(df)[,list(col1 = c(progress), col2 = c(dates)), by = .(unique(id))]
但当然,我得到了遵循错误:
错误
[.data.table
(DF,列表(COL1 = C(进度),COL2 = C(日期)), :在“由”或“keyby”列表中的项的长度(5) 每个必须是相同的长度,在x或返回的行的行数为i (10)
数据:。
structure(list(id = c("3505H6856", "3505H6856", "3505H6856",
"3505H6856", "3505H67158", "3505H67158", "3505H67862", "3505H62168",
"3505H62168", "3505H65277"), dates = structure(c(12243, 12285,
12299, 12341, 12066, 12101, 12117, 12166, 12187, 12094), class = "Date"),
progress = c("yes", "yes", "yes", "yes", "yes", "yes", "yes",
"no", "yes", "yes")), .Names = c("id", "dates", "progress"
), class = c("data.frame"), row.names = c(NA, -10L
))
'通过=(ID)'的',而不是通过=(唯一(ID))' –
@ErdemAkkas是的,但我想通过唯一的ID组。 – Omlere