将R中的data.table从四个id列转换为一个id列,通过创建额外的列

我正在尝试使用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,所以你可能需要获取最新的开发版本

Related Posts

Keras Dense层输入未被展平

这是我的测试代码: from keras import…

无法将分类变量输入随机森林

我有10个分类变量和3个数值变量。我在分割后直接将它们…

如何在Keras中对每个输出应用Sigmoid函数?

这是我代码的一部分。 model = Sequenti…

如何选择类概率的最佳阈值?

我的神经网络输出是一个用于多标签分类的预测类概率表: …

在Keras中使用深度学习得到不同的结果

我按照一个教程使用Keras中的深度神经网络进行文本分…

‘MatMul’操作的输入’b’类型为float32,与参数’a’的类型float64不匹配

我写了一个简单的TensorFlow代码,但不断遇到T…

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注