【问题标题】:R data.table Accessing elements from a column of listsR data.table 从一列列表中访问元素
【发布时间】:2017-06-14 15:29:03
【问题描述】:

我一直在关注 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

我可以使用以下 sn-p 代码来提取静态元素,例如索引 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])]

但是,上面的 sn-p 没有按预期工作。如何根据另一列的值访问列表的元素?

【问题讨论】:

  • 试试dt[,gearA := Map("[", gearsL, IDX)]
  • 仅供参考,“列表列”,正如它们通常所说的那样,速度非常慢,还有其他选择。此外,组内的行号可用作 dt[, idx := rowid(gear)]
  • 我只是不明白为什么这个问题被否决了......我已经提供了所有必要的复制步骤,处理了正确的格式,还提到了我的尝试。 SO 社区有时让我失望。
  • 首先,不,您没有提供必要的信息。无法知道您的列是“4,3,5”还是列表(4,3,5)。您可能认为它是什么很明显,但发布者通常会错误地理解他们的数据实际上是如何构建的。而且您没有以可重现的方式提供它。请参阅stackoverflow.com/questions/5963269/… 其次,我可以投反对票,因为我发现它“没有用”,因为我认为数据不应该以这种方式结构化或访问。
  • 我提供了一个指向问题背景的链接,从我提供的第一个代码 sn-p 可以清楚地看到我们正在谈论列表列表。如果我从链接中写出每一篇文章,这会使问题变得非常冗长和混乱。但是,问题的重点是简单地询问如何动态访问 data.table 列表列元素。此外,我并不是说这个问题是完美的。很多很多问题在 SO 中并不完美。这并不意味着他们都需要被否决和删除,对吧?

标签: r list data.table lapply sapply


【解决方案1】:

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

这同时运行在 gearsLIDX 上,将它们作为参数提供给 [[ 函数。即gears[[i]][[IDX[[i]]]]

【讨论】:

  • 太好了,谢谢,它成功了。问题是,为什么我不能在 sapply 中使用 IDX?
  • sapply(gearsL, function(x) x[IDX])c(gearsL[[1]][IDX], gears[[2]][IDX], ...) 相同。如果您需要在一个函数中对多个参数进行矢量化,请使用mapply
  • 或没有 mapply dt[, gearsA := gearsL %>% `[[`(1) %>%`[`(IDX), by=1:nrow(dt)]
猜你喜欢
  • 2020-05-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-12-20
  • 2014-09-24
  • 1970-01-01
  • 2021-05-17
相关资源
最近更新 更多