【问题标题】:Faster alternative to melt and rbind更快的替代 melt 和 rbind
【发布时间】:2018-12-21 08:41:55
【问题描述】:

我有一个大的字符向量列表,看起来像这样:

List of 53095
 $ 30875  : chr [1:10] "<h2 class=\"buildings-page-title buildings- ...
 $ 30876  : chr [1:10] "<h2 class=\"buildings-page-title buildings- ...

我想创建一个带有单列的 data.table(或数据框)。所以我所做的是:

# require(purr); require(data.table)
clean.data<-function(input){
  output1<-map(input, melt)
  output2<-data.frame()
 for (i in 1:length(output1)) { 
  output2<-rbind(output2, output1[[i]])

 }
 return(output2)}

以测试数据为例,我想要的是

test<-list(c("hello", "world", "!"), c("Nice","to","meet","you"))
print(clean.data(test))
> print(clean.data(test))
  value
1 hello
2 world
3     !
4  Nice
5    to
6  meet
7   you

但是这个函数非常慢,可能是因为我的数据集很大,但我认为我的代码很糟糕。有没有其他更有效的方法来获得相同的结果?

【问题讨论】:

  • 很好的电话询问这个。由于您的代码,您正在减速。对于代码中的每个循环,R 必须确定将 output2 数据帧扩展多少,然后检查以确保数据兼容,然后合并数据。扩展 output2 在内存中需要很长时间。使用以下解决方案中的功能将有所帮助。或者,如果您想在循环中执行操作,您可以先设置 output2 的大小,然后再进入循环执行类似output2 &lt;- character(length(mylist)) 的操作,它会在内存中为您分配一个大的 [empty] 向量。

标签: r data.table rbind melt


【解决方案1】:

更快的方法是unlist 它并创建一个单列data.frame

data.frame(value = unlist(test))

【讨论】:

    猜你喜欢
    • 2011-10-28
    • 2020-06-03
    • 1970-01-01
    • 1970-01-01
    • 2018-05-29
    • 2018-12-11
    • 2012-07-05
    • 2012-01-23
    • 2019-08-19
    相关资源
    最近更新 更多