2013-09-28 3 views
1

allWords - вектор 1,3 миллиона слов с некоторым повторением. То, что я хочу сделать, это создать два вектора:R берет навсегда, чтобы вычислить простую процедуру

А со словом

B с вхождением слова

Так что я могу позже присоединиться к ним в матрице и тем самым связать их, например: «мама», 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) 
} 

Этот цикл занимает навсегда, и я не знаю, почему или то, что я делаю неправильно. Чтение 1,3 миллиона слов из файла происходит так же быстро, как 5 секунд, но выполнение этих основных операций никогда не прекращает работу алгоритма.

+6

Вы в Круге 2 [в R Inferno] (http://www.burns-stat.com/pages/Tutor/R_inferno.pdf) – GSee

+1

Кто-то должен дать это лучшее название ... может быть, «сокращение и увеличение объектов в цикле» – Frank

ответ

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 
+1

OP тоже хочет позиции, поэтому ... 'dtx [, list (.N, occ = list (.I)), by = «x»] ', я думаю. – Frank

+1

Это действительно самый быстрый. Проверьте это: http://stackoverflow.com/questions/17223308/fastest-way-to-count-occurrences-of-each-unique-element –

3

Использование table():

> table(c("dog", "cat", "dog")) 

cat dog 
    1 2 

векторы являются столбцы соответствующего dataframe:

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

Результат:

> A 
[1] cat dog 
Levels: cat dog 
> B 
[1] 1 2 
0

Вы можете использовать list, чтобы сделать что-то вроде хэша «ключ: значение».

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 
+2

Проблема заключается в цикле. Это обречено на вечность. :-) –

+0

@ Ferdinand.kraft, кажется, ты прав. Я не понимал, что R будет бороться с массивом умеренного размера. Upvote. – AGS

Смежные вопросы