我如何提高这个R代码的性能?

我如何提高这个R代码的性能?,r,R,我对这段代码的性能有问题。我必须循环2225列并计算一个betti_数。我想知道是否有办法加快速度。我想在末尾列出贝蒂的号码,这样我就可以把它添加到excel文件中 library(nonlinearTseries) library(TDAstats) library(tidyverse) library(dplyr) library(readxl) library(tm) #NLP betti_num_list <- list() for (i in 1:ncol(wordvec_df

我对这段代码的性能有问题。我必须循环2225列并计算一个betti_数。我想知道是否有办法加快速度。我想在末尾列出贝蒂的号码,这样我就可以把它添加到excel文件中

library(nonlinearTseries)
library(TDAstats)
library(tidyverse)
library(dplyr)
library(readxl)
library(tm) #NLP

betti_num_list <- list()
for (i in 1:ncol(wordvec_df)){
vec <- zoo::na.trim(wordvec_df[,i], is.na = "all") #Removes NA's from bottom of vector
text_vector_matrix <- data.matrix(vec)
tak <- buildTakens(text_vector_matrix,2,3)
hom <- calculate_homology(tak,return_df = TRUE) 
hom <- hom %>%
  mutate(persistence = death-birth) %>%
  mutate(persistent = ifelse(persistence > 0.1, 1,0))
hom_matrix <- tibble(hom) %>% select(dimension, persistent)
betti_num <- sum(hom$persistent == 1 & hom$dimension == 1)
betti_num_list <- append(betti_num_list, betti_num)
}
库(非线性系列)
图书馆(TDASTAS)
图书馆(tidyverse)
图书馆(dplyr)
图书馆(readxl)
图书馆(tm)#NLP

betti_num_list您必须检查betti数字是否有意义,我无法让您的代码100%正常工作。出于同样的原因,我也没有做任何基准测试,但我希望它能带来一些改进。我在代码中看到的主要问题是一些不必要的步骤(主要是重新映射)和使用低效的数据结构(可能时使用向量、矩阵和数组)

库(TDAstats)
图书馆(非线性系列)

bettinum在尝试提高性能时,我建议使用
profvis
包首先查看代码中哪个点出现了速度/内存瓶颈,以查看代码的哪个部分需要更改。从您的示例中,不清楚
buildTakens
calculate\u homology
在做什么。buildTakens将一维向量嵌入到二维中,但不绘制它。calculate_同源性采用二维嵌入(点云数据集)并计算其持久同源性。它是TDAstatsOK中的一个预构建函数,仅供将来参考。最好包含您使用的所有包(或者包含不太常见的函数的名称空间)!同样,我建议您分析代码(请参阅)。你的代码目前需要多长时间?这绝对是一个进步,你能给我解释一下vec_list@MattOReilly:它只是生成一些示例数据,选取0到5之间的x个随机整数,x={8..20}。
V1 <- c(1,0,0,0,0,1,2,NA)
V2 <- c(2,1,1,0,0,1,NA,NA)
V3 <- c(1,2,1,0,0,NA,NA,NA)

wordvec_df <- data.frame(V1,V2,V3)
library(TDAstats)
library(nonlinearTseries)

bettinum <- function(vec, embedding.dim=2, time.lag=3) {
    hom <- calculate_homology(buildTakens(vec, embedding.dim, time.lag))
    sum((hom[, "death"] - hom[, "birth"] > 0.1) & hom[, "dimension"] == 1) 
}

set.seed(1)
vec_list <- lapply(8:20, function(x) sample(0:5, x, rep=TRUE))

betti <- sapply(vec_list, bettinum)
betti
#  [1] 0 1 0 0 0 1 0 1 1 2 0 1 1