R 计算一个简单的过程需要花费很长时间

R 计算一个简单的过程需要花费很长时间,r,for-loop,R,For Loop,allWords是一个130万单词的向量,有一些重复。我想做的是创建两个向量: 一个带单词的单词 随着这个词的出现 这样我以后就可以把它们加入一个矩阵,然后把它们联系起来,比如:妈妈,3岁;铅笔,14等 for(word in allWords){ #get a vector with indexes for all repetitions of a word temp <- which(allWords==word) #Make "allWords" smal

allWords是一个130万单词的向量,有一些重复。我想做的是创建两个向量:

一个带单词的单词

随着这个词的出现

这样我以后就可以把它们加入一个矩阵,然后把它们联系起来,比如:妈妈,3岁;铅笔,14等

for(word in allWords){

    #get a vector with indexes for all repetitions of a word
    temp <- which(allWords==word) 
    #Make "allWords" smaller - remove duplicates
    allWords= allWords[-which(allWords==word)]
    #Calculate occurance
    occ<-length(temp)
    #store
    A = c(A,word)
    B = c(B,occ)
}
这个for循环需要很长时间,我真的不知道为什么或者我做错了什么。从一个文件中读取130万字的速度最快可达5秒,但执行这些基本操作不会让算法终止。

使用表格:

向量是对应数据帧的列:

A <- as.data.frame(table(c("dog", "cat", "dog")))[,1]
B <- as.data.frame(table(c("dog", "cat", "dog")))[,2]
使用表:

向量是对应数据帧的列:

A <- as.data.frame(table(c("dog", "cat", "dog")))[,1]
B <- as.data.frame(table(c("dog", "cat", "dog")))[,2]

给出向量的大小,我认为data.table在这种情况下是个好朋友_

> library(data.table)
> x <- c("dog", "cat", "dog")  # Ferdinand.kraft's example vector
> dtx <- data.table(x)         # converting `x` vector into a data.table object
> dtx[, .N, by="x"]            # Computing the freq for each word
     x N
1: dog 2
2: cat 1

给出向量的大小,我认为data.table在这种情况下是个好朋友_

> library(data.table)
> x <- c("dog", "cat", "dog")  # Ferdinand.kraft's example vector
> dtx <- data.table(x)         # converting `x` vector into a data.table object
> dtx[, .N, by="x"]            # Computing the freq for each word
     x N
1: dog 2
2: cat 1
您可以使用列表来创建类似哈希键:值对的内容

data = c("joe", "tom", "sue", "joe", "jen")

aList = list()

for(i in data){
    if (length(aList[[i]]) == 0){
      aList[[i]] = 1
    } else {
      aList[[i]] = aList[[i]] + 1
    }
}   
结果

$joe
[1] 2

$tom
[1] 1

$sue
[1] 1

$jen
[1] 1
您可以使用列表来创建类似哈希键:值对的内容

data = c("joe", "tom", "sue", "joe", "jen")

aList = list()

for(i in data){
    if (length(aList[[i]]) == 0){
      aList[[i]] = 1
    } else {
      aList[[i]] = aList[[i]] + 1
    }
}   
结果

$joe
[1] 2

$tom
[1] 1

$sue
[1] 1

$jen
[1] 1

你在别人的第二圈应该给这个更好的标题…也许缩短和增加循环中的对象你在别人的第二圈应该给这个更好的标题…也许缩短和增加循环中的对象OP也想要位置,所以。。。我猜是dtx[,list.N,occ=list.I,by=x],这确实是最快的。检查这个:OP也需要这些位置,所以。。。我猜是dtx[,list.N,occ=list.I,by=x],这确实是最快的。检查此项:问题在于循环。这注定要花很长时间-@费迪南德,卡夫,看来你是对的。我没有意识到R将与中等大小的阵列斗争。向上投票。问题在于循环。这注定要花很长时间-@费迪南德,卡夫,看来你是对的。我没有意识到R将与中等大小的阵列斗争。向上投票。