R data.table访问列表列

时间:2017-06-14 15:29:04

标签: r list data.table lapply sapply

我一直在关注data.tables here的教程 让我们说我有下表(我已经更改了原始表以适合我的问题)

##    gear cyl gearsL
## 1:    4   6  4,3,5
## 2:    4   6  4,3,5
## 3:    4   4  4,3,5
## 4:    3   6  5,6,7
## 5:    3   8  5,6,7
## 6:    3   6  5,6,7

我现在想要创建一个新的列,它将"取消组合" gearsL栏,如下:

##    gear cyl gearsL  gearA
## 1:    4   6  4,3,5  4
## 2:    4   6  4,3,5  3
## 3:    4   4  4,3,5  5
## 4:    3   6  5,6,7  5
## 5:    3   8  5,6,7  6
## 6:    3   6  5,6,7  7

我可以使用以下代码片段来提取静态元素,例如指数2的元素。

dt[,gearL1:=lapply(gearsL, function(x) x[2])]
dt[,gearS1:=sapply(gearsL, function(x) x[2])]

这将产生下表:

##    gear cyl gearsL  gearL1 gearS1
## 1:    4   6  4,3,5  3      3
## 2:    4   6  4,3,5  3      3
## 3:    4   4  4,3,5  3      3
## 4:    3   6  5,6,7  6      6
## 5:    3   8  5,6,7  6      6
## 6:    3   6  5,6,7  6      6

然而,我想要一个"动态"指数。首先,我创建了一个名为IDX的新字段,它充当带有组的行号。

dt[,IDX:=1:.N,by='gear']

将产生下表:

##    gear cyl gearsL  gearL1 gearS1  IDX
## 1:    4   6  4,3,5  3      3        1
## 2:    4   6  4,3,5  3      3        2
## 3:    4   4  4,3,5  3      3        3
## 4:    3   6  5,6,7  6      6        1
## 5:    3   8  5,6,7  6      6        2
## 6:    3   6  5,6,7  6      6        3

使用新创建的IDX列,我想按如下方式访问每个列表的元素:

 dt[,gearA:=sapply(gearsL, function(x) x[IDX])]
 dt[,gearA:=lapply(gearsL, function(x) x[IDX])]

但是,上述代码段没有按预期工作。如何根据另一列的值访问列表元素?

1 个答案:

答案 0 :(得分:2)

dt[, gearA := mapply('[[', gearsL, IDX, SIMPLIFY = TRUE)]

这将同时运行gearsLIDX,将它们作为[[函数的参数。即,gears[[i]][[IDX[[i]]]]