我正在尝试使用data.table为一个机器学习问题创建大约1000个特征。我有两个通过id链接的表。第一个表每行有一个唯一的id,我们称之为x。第二个表对于每个id x有多个行。此外,我还有三个其他列,这些列是因子类型变量。我还有一些其他需要使用的数值列。我的目标是计算每个数值变量的min、max和mean,这些变量按x和其他因子变量分组,然后重塑信息,使得每行只有一个唯一的x id,通过为因子列的每个组合以及相关的计算数值列创建一个列。由于我有许多数值列,我还希望在不硬编码列和不使用循环的情况下完成这个操作,因为有许多数值列。
作为示例,我可以使用以下代码创建基本结构的data.table:
set.seed(1234)DT <- data.table(x=rep(c(1,2,3),each=8), y1=c("A","B"), y2=c("C","D", "E"),y3=c("F","G"), v1=sample(1:100,12), v2=sample(1:100,12), v3=sample(1:100,12))DT x y1 y2 y3 v1 v2 v3 1: 1 A C F 12 29 22 2: 1 B D G 62 92 81 3: 1 A E F 60 100 52 4: 1 B C G 61 82 89 5: 1 A D F 83 28 80 6: 1 B E G 97 26 5 7: 1 A C F 1 18 43 8: 1 B D G 22 22 25 9: 2 A E F 99 30 2910: 2 B C G 47 96 4711: 2 A D F 63 15 1712: 2 B E G 49 4 6813: 2 A C F 12 29 2214: 2 B D G 62 92 8115: 2 A E F 60 100 5216: 2 B C G 61 82 8917: 3 A D F 83 28 8018: 3 B E G 97 26 519: 3 A C F 1 18 4320: 3 B D G 22 22 2521: 3 A E F 99 30 2922: 3 B C G 47 96 4723: 3 A D F 63 15 1724: 3 B E G 49 4 68 x y1 y2 y3 v1 v2 v3
然后使用以下代码创建一个示例分组:
interim <- DT[,list(v1min=min(v1), v1max=max(v1), v1mean=mean(v1), v2min=min(v2), v2max=max(v2), v2mean=mean(v2), v3min=min(v3), v3max=max(v3), v3mean=mean(v3)), by=.(x,y1,y2,y3)]interim x y1 y2 y3 v1min v1max v1mean v2min v2max v2mean v3min v3max v3mean 1: 1 A C F 1 12 6.5 18 29 23.5 22 43 32.5 2: 1 B D G 22 62 42.0 22 92 57.0 25 81 53.0 3: 1 A E F 60 60 60.0 100 100 100.0 52 52 52.0 4: 1 B C G 61 61 61.0 82 82 82.0 89 89 89.0 5: 1 A D F 83 83 83.0 28 28 28.0 80 80 80.0 6: 1 B E G 97 97 97.0 26 26 26.0 5 5 5.0 7: 2 A E F 60 99 79.5 30 100 65.0 29 52 40.5 8: 2 B C G 47 61 54.0 82 96 89.0 47 89 68.0 9: 2 A D F 63 63 63.0 15 15 15.0 17 17 17.010: 2 B E G 49 49 49.0 4 4 4.0 68 68 68.011: 2 A C F 12 12 12.0 29 29 29.0 22 22 22.012: 2 B D G 62 62 62.0 92 92 92.0 81 81 81.013: 3 A D F 63 83 73.0 15 28 21.5 17 80 48.514: 3 B E G 49 97 73.0 4 26 15.0 5 68 36.515: 3 A C F 1 1 1.0 18 18 18.0 43 43 43.016: 3 B D G 22 22 22.0 22 22 22.0 25 25 25.017: 3 A E F 99 99 99.0 30 30 30.0 29 29 29.018: 3 B C G 47 47 47.0 96 96 96.0 47 47 47.0
理想的输出应该只有3行 – 每行对应一个唯一的x(1,2,3),列如下(预计会有一些NA):
x | A-C-F-v1min | A-C-F-v1max | A-C-F-v1mean | . . . | B-C-G-v3min | B-C-G-v3max | B-C-G-v3mean
回答:
这样可以实现:
dcast(interim, x~y1+y2+y3, value.var = setdiff(names(interim), c('x', 'y1', 'y2', 'y3')))
我不记得在1.9.6版本中是否支持多个value.var
,所以你可能需要获取最新的开发版本。