在数据框中的多个列或R中的data.table中计算组索引(组标识符)的最有效方法是什么?
例如,在下面的数据框中,列A和B有六种独特的组合。
DF <- data.frame(a = rep(1:2,6), b = sort(letters[1:3]))
> DF
a b
1 1 a
2 2 b
3 1 c
4 2 a
5 1 b
6 2 c
7 1 a
8 2 b
9 1 c
10 2 a
11 1 b
12 2 c
我想添加一个带有组标识符的列'index',就像这个产生的那样(对于大数据帧来说效率显然很低):
DF$index <- with(DF, as.numeric(factor(paste0(a, b))))
> DF
a b index
1 1 a 1
2 2 b 5
3 1 c 3
4 2 a 4
5 1 b 2
6 2 c 6
7 1 a 1
8 2 b 5
9 1 c 3
10 2 a 4
11 1 b 2
12 2 c 6
使用非常大的数据帧执行此操作的最快方法是什么?
答案 0 :(得分:2)
如何使用data.table
,
library(data.table)
setDT(df)[,group :=.GRP,by = .(a,b)]
<强>输出强>:
> df
a b group
1: 1 a 1
2: 2 b 2
3: 1 c 3
4: 2 a 4
5: 1 b 5
6: 2 c 6
7: 1 a 1
8: 2 b 2
9: 1 c 3
10: 2 a 4
11: 1 b 5
12: 2 c 6
答案 1 :(得分:1)
在基数R中,您可以使用interaction
,这比paste
方法快一点,尽管data.table
方法仍然更快。
DF$index <- as.integer(interaction(DF))
这将返回所需的结果
DF
a b index
1 1 a 1
2 2 b 4
3 1 c 5
4 2 a 2
5 1 b 3
6 2 c 6
7 1 a 1
8 2 b 4
9 1 c 5
10 2 a 2
11 1 b 3
12 2 c 6
<强>定时强>
以下是更大数据集的一些时间安排:
### set up
# 60K observations
DF <- data.frame(a = rep(1:2,60000), b = letters[1:20])
# make a data table copy
library(data.table)
DT <- data.table(DF)
library(microbenchmark)
microbenchmark(paste=with(DF, as.numeric(factor(paste0(a, b)))),
interaction=as.integer(interaction(DF)),
grp=DT[,group :=.GRP,by = .(a,b)])
Unit: milliseconds
expr min lq mean median uq max neval cld
paste 38.664541 41.100587 46.315671 42.030301 42.903709 91.32412 100 c
interaction 4.203244 5.788548 9.927459 6.141646 6.943635 55.15564 100 b
grp 1.771617 1.897632 2.772984 2.138828 2.218371 49.41399 100 a