数据表有向量作为条目 - 如何找出在哪一列中,然后只将向量的第二个条目作为单个整数

Mik*_*kiK 5 r vector data.table

我有一个数据表tmp,它看起来像这样(只是一个简短的例子):

dput(tmp)
structure(list(`2020-03-29-00` = list(42.51, 0, 0, 0, 12.32), 
    `2020-03-29-01` = list(46.8, 0, 0, 0, 10.03), `2020-03-29-03` = list(
        c(46.8, 41.87), c(0, 0), c(0, 0), c(0, 0), c(10.03, 10.04
        )), `2020-03-29-04` = list(45.63, 0, 0, 0, 9.24), `2020-03-29-05` = list(
        40.86, 0, 0, 0, 9.06), `2020-03-29-06` = list(45.85, 
        0, 0, 0, 9.19), `2020-03-29-07` = list(43.68, 0, 0, 0, 
        10.39), `2020-03-29-08` = list(47.14, 0, 0, 0, 9.99), 
    `2020-03-29-09` = list(49.06, 0, 0, 0, 11.24)), row.names = c(NA, 
-5L), class = c("data.table", "data.frame"), .internal.selfref = <pointer: 0x0000015baf701ef0>)
Run Code Online (Sandbox Code Playgroud)

在这里我们可以看到,第三列 (" 2020-03-29-03") 具有向量条目。我想要的是将此向量的第二个条目作为单个整数条目。向量列(这里:第三列)并不总是在同一个列索引上。所以,首先我们需要找出条目是向量的位置,然后只取这个向量的第二个条目。

最后我的数据表应该是这样的:

structure(list(`2020-03-29-00` = list(42.51, 0, 0, 0, 12.32), 
    `2020-03-29-01` = list(46.8, 0, 0, 0, 10.03), `2020-03-29-03` = list(
        c(41.87), 0, 0, 0, c(10.04)), 
    `2020-03-29-04` = list(45.63, 0, 0, 0, 9.24), `2020-03-29-05` = list(
        40.86, 0, 0, 0, 9.06), `2020-03-29-06` = list(45.85, 
        0, 0, 0, 9.19), `2020-03-29-07` = list(43.68, 0, 0, 0, 
        10.39), `2020-03-29-08` = list(47.14, 0, 0, 0, 9.99), 
    `2020-03-29-09` = list(49.06, 0, 0, 0, 11.24)), row.names = c(NA, 
-5L), class = c("data.table", "data.frame"), .internal.selfref = <pointer: 0x0000015baf701ef0>)
Run Code Online (Sandbox Code Playgroud)

Uwe*_*Uwe 3

如果您tmp使用str(tmp)或检查,lapply(tmp, class)您会注意到所有列都是列表列,即使是向量仅包含一个元素的列。

此外,这可以通过设置适当的打印选项来公开

library(data.table)
options(datatable.print.class = TRUE)
tmp
Run Code Online (Sandbox Code Playgroud)
   2020-03-29-00 2020-03-29-01 2020-03-29-03 2020-03-29-04 2020-03-29-05 2020-03-29-06 2020-03-29-07 2020-03-29-08 2020-03-29-09
          <list>        <list>        <list>        <list>        <list>        <list>        <list>        <list>        <list>
1:         42.51          46.8   46.80,41.87         45.63         40.86         45.85         43.68         47.14         49.06
2:             0             0           0,0             0             0             0             0             0             0
3:             0             0           0,0             0             0             0             0             0             0
4:             0             0           0,0             0             0             0             0             0             0
5:         12.32         10.03   10.03,10.04          9.24          9.06          9.19         10.39          9.99         11.24
Run Code Online (Sandbox Code Playgroud)

因此,如果所有列表列都需要强制为数字,我们可以使用以下函数选取每个向量中的最后一个值(恰好是第 3 列中的第二个向量条目)last()

tmp[, lapply(.SD, \(x) sapply(x, last)), .SDcols = is.list]
Run Code Online (Sandbox Code Playgroud)
   2020-03-29-00 2020-03-29-01 2020-03-29-03 2020-03-29-04 2020-03-29-05 2020-03-29-06 2020-03-29-07 2020-03-29-08 2020-03-29-09
           <num>         <num>         <num>         <num>         <num>         <num>         <num>         <num>         <num>
1:         42.51         46.80         41.87         45.63         40.86         45.85         43.68         47.14         49.06
2:          0.00          0.00          0.00          0.00          0.00          0.00          0.00          0.00          0.00
3:          0.00          0.00          0.00          0.00          0.00          0.00          0.00          0.00          0.00
4:          0.00          0.00          0.00          0.00          0.00          0.00          0.00          0.00          0.00
5:         12.32         10.03         10.04          9.24          9.06          9.19         10.39          9.99         11.24
Run Code Online (Sandbox Code Playgroud)

现在,所有列都是数字。