R数据表:将向量转换为单行数据表

4

我有一个字符向量x,我想以高效的方式将其转换为一行数据表。命令data.table(x)返回一个列数据表。现在,data.table(t(x))可以完成任务,但我想知道是否有更快的方法。


1
真正的问题是:你为什么想要这样做?拥有只有一行且每个元素都相同的表格几乎没有意义。你确定吗?标准的“字符”向量(甚至只有一行的矩阵)似乎非常适合这种对象。 - nicola
@nicola 这是为了rbinding目的。我有一组不同大小的向量,我想将其转换为data.table以进行分析。 - NewNameStat
1
如果是这种情况,你应该在转换成 data.table 前使用 rbind。每行转换成 data.table 并在之后 rbind 的做法更糟糕。 - nicola
1
@nicola 如果y是我的字符向量列表。 rbindlist(lapply(y,as.list))似乎要快得多!现在我有点贪心。我仍然必须循环遍历y-是否有更快的方法? rbindlist现在是我词汇表中的新功能-是否有其他函数可以处理此操作而无需首先将所有内容转换为列表? - NewNameStat
我建议您提出另一个问题,明确说明您的输入和期望的输出。在这个阶段,很难确定什么对您更好。 - nicola
请参见#1244,它将扩展setDT到这种情况。还请参见jangorecki的此问题 / eddi的相应答案。 - MichaelChirico
1个回答

8
我们可以使用。
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 

更新

如果以上练习是将一个向量与data.table进行rbind,我们不需要将向量转换为data.table

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

4
似乎 as.data.table(t(v1)) 更快(并且类似于 setDT)。 - digEmAll
非常有趣!我有几个问题:1)我对setDT()和data.table()之间的区别的理解与内存分配有关。为什么setDT(as.list(x))和as.data.table(as.list(x))返回不同的结果?2)在setDT的末尾,[]是什么意思? - NewNameStat
1
@NewNameStat 你所说的“不同的东西”是什么意思?根据示例,它们返回相同的5列。方括号[]用于打印输出。 - akrun
@akrun 正如您在答案中所提到的,它们都返回相同的内容。将 list_x = as.list(x) 设置后,我想知道为什么 setDT(list_x) 和 as.data.table(list_x) 不会返回相同的结果。前者返回一个一行的数据表,而后者返回一个一列的数据表。 - NewNameStat
2
@NewNameStat 再次运行,对我来说仍然返回相同的即一个行数据表。dim(as.data.table(list_x)) # [1] 1 5 dim(setDT(list_x)) # [1] 1 5 根据对 nicola 的评论,我认为您不需要将其转换为 data.table。只需将其作为 list 使用,然后将其放置在 rbindlist 中即可。 - akrun

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接