Пакет tm: вывод findAssocs() в матрицу вместо списка в R

Рассмотрим следующий список:

library(tm)
data("crude")
tdm <- TermDocumentMatrix(crude)
a <- findAssocs(tdm, c("oil", "opec", "xyz"), c(0.7, 0.75, 0.1))

Как мне удается иметь фрейм данных со всеми терминами, связанными с этими 3 словами в столбцах, и показывать:

  1. Соответствующий коэффициент корреляции (если он существует)
  2. NA, если его не существует для этого слова (например, пара (масло, они) будет показывать NA)

person Steven Beaupré    schedule 24.09.2014    source источник
comment
Обновлено решение на основе вашего нового a.   -  person akrun    schedule 24.09.2014


Ответы (2)


Вот решение, использующее reshape2 для изменения формы данных.

library(reshape2)
aa<-do.call(rbind, Map(function(d, n) 
    cbind.data.frame(
      xterm=if (length(d)>0) names(d) else NA, 
      cor=if(length(d)>0) d else NA, 
      term=n),
    a, names(a))
)

dcast(aa, term~xterm, value.var="cor")
person MrFlick    schedule 24.09.2014
comment
Я немного не понимаю, почему a <- findAssocs(tdm, c("oil", "opec", "xyz"), c(0.7, 0.75, 0.1)) работает, a <- findAssocs(tdm, c("oil", "opec", "xyz"), 0.7)) тоже работает, а a <- findAssocs(tdm, tdm$dimnames$Terms, 0.7) нет. В конце концов, разве tdm$dimnames$Terms не является вектором в той же форме, что и c("") ? - person Steven Beaupré; 25.09.2014
comment
Это не работает, потому что findAssocs(tdm, c("oil", "opec", "xyz"), 0.7) сравнивает термины c("oil", "opec", "xyz") со всеми оставшимися терминами в корпусе. Например, он не сравнивает нефть с ОПЕК. Он не вычисляет попарные корреляции терминов в векторе, который вы передаете. Поэтому, когда вы передаете каждый термин в корпусе, нечего сравнивать, поэтому вы не получаете результатов. - person MrFlick; 25.09.2014

Или вы можете использовать dplyr и tidyr

 library(dplyr)
 library('devtools')
 install_github('hadley/tidyr')

 library(tidyr)

 a1 <- unnest(lapply(a, function(x) data.frame(xterm=names(x),
                cor=x, stringsAsFactors=FALSE)), term)


  a1 %>% 
     spread(xterm, cor) #here it removed terms without any `cor` for the `xterm`
  #  term 15.8 ability above agreement analysts buyers clearly emergency fixed
  #1  oil 0.87      NA  0.76      0.71     0.79   0.70     0.8      0.75  0.73
  #2 opec 0.85     0.8  0.82      0.76     0.85   0.83      NA      0.87    NA
  #  late market meeting prices prices. said that they trying who winter
  #1  0.8   0.75    0.77   0.72      NA 0.78 0.73   NA    0.8 0.8    0.8
  #2   NA     NA    0.88     NA    0.79 0.82   NA  0.8     NA  NA     NA

Обновлять

 aNew <- sapply(tdm$dimnames$Terms, function(i) findAssocs(tdm, i, corlimit=0.95))
 aNew2 <- aNew[!!sapply(aNew, function(x) length(dim(x)))]
 aNew3 <- unnest(lapply(aNew2, function(x) data.frame(xterm=rownames(x), 
                     cor=x[,1], stringsAsFactors=FALSE)[1:3,]), term)
  res <- aNew3 %>% 
              spread(xterm, cor) 

  dim(res)
  #[1] 1021  160

   res[1:3,1:5]
    #     term ... 100,000 10.8 1.1
    #1     ...  NA      NA   NA  NA
    #2 100,000  NA      NA   NA   1
    #3    10.8  NA      NA   NA  NA
person akrun    schedule 24.09.2014
comment
Что, если a было: a <- sapply(tdm$dimnames$Terms, function(i) findAssocs(tdm, i, corlimit=0.95)) - person Steven Beaupré; 24.09.2014
comment
@Steven Beaupre a взято из вашего поста a <- findAssocs(tdm,...) . Ваш новый код a <- sapply(...) выполняется долго. - person akrun; 24.09.2014
comment
@Steven Beaupre Это занимает очень много времени? - person akrun; 24.09.2014
comment
Да, это занимает много времени. - person Steven Beaupré; 24.09.2014
comment
@Steven Beaupre` Я проверю это позже, так как мне нужно идти. - person akrun; 24.09.2014