【发布时间】: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 <- character(length(mylist))的操作,它会在内存中为您分配一个大的 [empty] 向量。
标签: r data.table rbind melt