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)
如果您tmp
使用str(tmp)
或检查,lapply(tmp, class)
您会注意到所有列都是列表列,即使是向量仅包含一个元素的列。
此外,这可以通过设置适当的打印选项来公开
library(data.table)
options(datatable.print.class = TRUE)
tmp
Run Code Online (Sandbox Code Playgroud)
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
因此,如果所有列表列都需要强制为数字,我们可以使用以下函数选取每个向量中的最后一个值(恰好是第 3 列中的第二个向量条目)last()
:
tmp[, lapply(.SD, \(x) sapply(x, last)), .SDcols = is.list]
Run Code Online (Sandbox Code Playgroud)
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
现在,所有列都是数字。
归档时间: |
|
查看次数: |
88 次 |
最近记录: |