【问题标题】:R data.table: turn a vector into a one row data.tableR data.table:将向量转换为单行 data.table
【发布时间】:2016-03-25 13:59:44
【问题描述】:

我有一个字符向量 x,我想快速将其转换为单行 data.table。命令data.table(x) 返回一列data.table。现在,data.table(t(x)) 完成了工作,但我想知道是否有更快的方法。

【问题讨论】:

  • 真正的问题是:你为什么要这样做?有一个只有一行的表,其中每个元素都是相同的,这没什么意义。你确定吗?标准的character 向量(甚至是只有一行的矩阵)似乎非常适合这种对象。
  • @nicola 用于 rbinding 目的。我有一个不同大小的向量列表,我想将其转换为 data.table 进行分析。
  • 如果是这种情况,您应该先rbind,然后再转换为data.table。将每一行转换为 data.tablerbind 之后会更糟。
  • @nicola 如果y 是我的字符向量列表。 rbindlist(lapply(y, as.list)) 似乎确实快了很多!现在我有点贪心了。我仍然必须遍历 y - 有更快的方法吗? rbindlist 现在是我词典中的一个新函数 - 是否有其他函数可以在不先将所有内容转换为列表的情况下处理这个问题?
  • 我建议您再问一个问题,准确说明您的输入和所需的输出。无法判断现阶段什么对您更好。

标签: r optimization data.table


【解决方案1】:

我们可以使用

x <- 1:5
setDT(as.list(x))[]

基准测试

v1 <- 1:1e5
system.time(data.table(t(v1)))
#   user  system elapsed 
#  12.95    0.01   12.97 
system.time(setDT(as.list(v1)))
#  user  system elapsed 
#   5.75    0.00    5.75 

system.time(as.data.table(t(v1)))
#    user  system elapsed 
#   6.35    0.00    6.34 

更新

如果上面的操作是rbind一个带有data.table的向量,我们不需要将vector转换为data.table

 d1 <- data.table(V1= 1:3, V2= 4:6, V3=7:9)
 rbindlist(list(d1, as.list(1:3)))

【讨论】:

  • 另外as.data.table(t(v1)) 似乎更快(和 setDT 类似)
  • 非常有趣!我有几个问题:1)我对 setDT() 和 data.table() 之间区别的理解与内存分配有关。为什么 setDT(as.list(x)) 和 as.data.table(as.list(x)) 返回不同的东西? 2) setDT 末尾的 [] 做了什么?
  • @NewNameStat 你所说的不同的东西是什么意思?他们返回相同的 5 列(基于示例)。 [] 是打印输出
  • @akrun 正如您在回答中所说的那样,它们都返回相同的东西。设置 list_x = as.list(x),我想知道为什么 setDT(list_x) 和 as.data.table(list_x) 不返回相同的东西。前者返回单行data.table,后者返回单列data.table。
  • @NewNameStat 同样,它为我返回相同的,即一行 data.table。 dim(as.data.table(list_x)) #[1] 1 5 dim(setDT(list_x)) #[1] 1 5 基于对 nicola 的 cmets,我认为您不需要转换为 data.table。只需将其用作list,然后将其放入rbindlist
猜你喜欢
  • 2016-01-30
  • 1970-01-01
  • 1970-01-01
  • 2017-04-21
  • 1970-01-01
  • 1970-01-01
  • 2020-02-06
  • 2016-03-13
  • 2020-05-24
相关资源
最近更新 更多