R data.table 从列表的一列访问元素
R data.table Accessing elements from a column of lists
我一直在关注 data.tables here 上的教程
假设我有以下 table(我已经更改了原来的 table 以适合我的问题)
## 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
我现在想创建一个新的列"ungroup" 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])]
这将导致以下 table:
## 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
但是,我想要一个 "dynamic" 索引。首先,我创建了一个名为 IDX 的新字段,它充当带有组的行号。
dt[,IDX:=1:.N,by='gear']
这将导致以下 table:
## 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])]
但是,上面的代码片段没有按预期工作。如何根据另一列的值访问列表的元素?
dt[, gearA := mapply('[[', gearsL, IDX, SIMPLIFY = TRUE)]
这与 gearsL
和 IDX
一起运行,将它们作为 [[
函数的参数。即 gears[[i]][[IDX[[i]]]]
.
我一直在关注 data.tables here 上的教程 假设我有以下 table(我已经更改了原来的 table 以适合我的问题)
## 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
我现在想创建一个新的列"ungroup" 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])]
这将导致以下 table:
## 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
但是,我想要一个 "dynamic" 索引。首先,我创建了一个名为 IDX 的新字段,它充当带有组的行号。
dt[,IDX:=1:.N,by='gear']
这将导致以下 table:
## 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])]
但是,上面的代码片段没有按预期工作。如何根据另一列的值访问列表的元素?
dt[, gearA := mapply('[[', gearsL, IDX, SIMPLIFY = TRUE)]
这与 gearsL
和 IDX
一起运行,将它们作为 [[
函数的参数。即 gears[[i]][[IDX[[i]]]]
.