gpt4 book ai didi

r - 大字符串向量到 data.frame

转载 作者:行者123 更新时间:2023-12-04 10:11:28 27 4
gpt4 key购买 nike

我有一个大型词向量(100M 元素),其类型为:

words <- paste(letters,letters,letters,letters,sep="_")

(实际数据中的字不都是一样的,都是长度为8)

我想将它们转换为一个数据框,其中每个单词的字母都有一列,每个单词有一行。为此,我在结果上尝试了 str_split_fixedrbind,但在大向量 R 上会永远卡住/占用。

所以需要的形式输出:

      l1    l2    l3    l4
1 a a a a
2 b b b b
3 c c c c

有没有更快的方法?

最佳答案

解决方案:

  • 使用paste()将向量元素折叠在一起
  • 使用fread()将折叠后的向量解析为data.table/data.frame

作为函数:

collapse2fread <- function(x,sep) {

require(data.table)
fread(paste0(x,collapse="\n"),sep=sep,header=FALSE)
}

Rcpp 在上面?

是否也可以尝试通过 Rcpp 包在 c++ 中完成它以从中获得更多?像这样的东西:

std::string collapse_cpp(CharacterVector subject,const std::string collapseBy){

int n = subject.size();
std::string collapsed;

for(int i=0;i<n;i++){
collapsed += std::string(subject[i]) + collapseBy;
}
return(collapsed);
}

然后我们得到:

collapse_cpp2fread <- function(x,sep) {

require(data.table)
fread(collapse_cpp(x,collapse="\n"),sep=sep,header=FALSE)
}

cpp fxn 快速测试

microbenchmark(
paste0(words,collapse="\n"),
collapse_cpp(words,"\n"),
times=100)

虽然不多,但还是有的:

> Unit: microseconds
> expr min lq median uq max neval
> paste0(words, collapse = "\\n") 7.297 7.7695 8.162 8.4255 33.824 100
> collapse_cpp(words, "\\n") 4.477 5.0095 5.117 5.3525 17.052 100

与strsplit方法的比较:

做出更真实​​的输入

words <- rep(paste0(letters[1:8], collapse = '_'), 1e5) # 100K elements

基准:

microbenchmark(
do.call(rbind, strsplit(words, '_')),
fread(paste0(words,collapse="\n"),sep="_",header=FALSE),
fread(collapse_cpp(words,"\n"),sep="_",header=FALSE),
times=10)

给出:

> Unit: milliseconds
> expr min lq median uq
> do.call(rbind, strsplit(words, "_")) 782.71782 796.19154 822.73694 854.22211
> fread(paste0(words, collapse = "\\n"), sep = "_", header = FALSE) 62.56164 64.13504 68.22512 71.96075
> fread(collapse_cpp(words, "\\n"), sep = "_", header = FALSE) 47.16362 47.78030 50.12867 52.23102
> max neval
> 863.0790 10
> 151.5969 10
> 109.9770 10

那么在这个尺寸下大约有 20 倍的改进?希望对您有所帮助!

关于r - 大字符串向量到 data.frame,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23823865/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com