2016-06-30 3 views
1

У меня точно такой же вопрос в сообщении , за исключением того, что я использовал #quanteda для генерации dfm для модели svm (потому что мне нужно иметь точные данные для прогнозирования перекрестного подтверждения): How to recreate same DocumentTermMatrix with new (test) dataR: Восстановить матрицу с теми же документами с новыми данными

Однако мое обучающее множество (trainingtfidf как crude1.dtm в посте) имеет 170000+ документов и 670000+ в моем тестовом наборе (testtfidf как crude2.dtm в должности), так что я не мог преобразовать мой новый тест установлен либо на матрицу, либо на фрейм данных:

>testtfidf <- as.data.frame(testtfidf) 
Error in asMethod(object) : 
     Cholmod error 'problem too large' at file ../Core/cholmod_dense.c, line 105 

Так что я пытался сделать это как DFM непосредственно:

# Keep the column names in test set which are shared with training set 
testtfidf1 <- testtfidf[, intersect(colnames(testtfidf), colnames(trainingtfidf))] 
# Extracting column names in training set but not in testset 
namevactor <- colnames(protocoltfidf)[which(!colnames(protocoltfidf) %in% colnames(testtfidf1)==TRUE)] 
# Add the columns back to test set and set the elements as NA since the terms do that exist in the test set 
testtfidf1[,namevactor] <- NA 

Но он дал мне ошибку в последней строке:

Error in intI(i, n = di[margin], dn = dn[[margin]], give.dn = FALSE) : 
invalid character indexing 

Может ли один помочь мне с этим? Я боролся в течение двух дней, и я так близок, чтобы это сделать! Благодаря!

ответ

0

Этот ответ по-прежнему немного груб, но вот то, что я вижу, может быть проблемой. Похоже, вы используете пакет Tsparse.R. Он имеет функцию intI(). Функция intI() определена в нижней части сообщения. Это то место, где происходит ваша ошибка. Но вы можете вообще не использовать эту функцию. Рассмотрим следующее:

Кажется, что protocoltfidf является исходным набором данных. Вторая строка вашего фрагмента кода извлекает имена столбцов из протоколаtfff, которые не в наборе тестовых данных. Итак, «namesvactor» - это вектор строк, ни один из которых не является именами столбцов в testtfidf1.

Это может упростить проблему, но проблема может заключаться в том, что вы пытаетесь присвоить значениям NA столбцам в testtfidf1, которые даже не существуют. Помните, что «namesvactor» содержит строки имен столбцов, которые не существуют в testtfidf1. Поэтому строка testtfidf1 [, namevactor] ссылается на столбцы в testtfidf1, которые даже не существуют. Вероятно, поэтому у него проблемы с поиском этих столбцов.

Возможно, попробуйте просто создать новые столбцы в testtfidf1 с именами столбцов, которые являются строками в «namesvactor» и устанавливают значения в этих столбцах в NA.

intI <- function(i, n, dn, give.dn = TRUE) 
{ 
## Purpose: translate numeric | logical | character index 
##  into 0-based integer 
## ---------------------------------------------------------------------- 
## Arguments: i: index vector (numeric | logical | character) 
##  n: array extent   { == dim(.) [margin] } 
##  dn: character col/rownames or NULL { == dimnames(.)[[margin]] } 
## ---------------------------------------------------------------------- 
## Author: Martin Maechler, Date: 23 Apr 2007 

has.dn <- !is.null.DN(dn) 
DN <- has.dn && give.dn 
if(is(i, "numeric")) { 
storage.mode(i) <- "integer" 
if(anyNA(i)) 
    stop("'NA' indices are not (yet?) supported for sparse Matrices") 
if(any(i < 0L)) { 
    if(any(i > 0L)) 
    stop("you cannot mix negative and positive indices") 
    i0 <- (0:(n - 1L))[i] 
} else { 
    if(length(i) && max(i, na.rm=TRUE) > n) 
    stop(gettextf("index larger than maximal %d", n), domain=NA) 
    if(any(z <- i == 0)) i <- i[!z] 
    i0 <- i - 1L  # transform to 0-indexing 
} 
if(DN) dn <- dn[i] 
} 
else if (is(i, "logical")) { 
if(length(i) > n) 
    stop(gettextf("logical subscript too long (%d, should be %d)", 
      length(i), n), domain=NA) 
i0 <- (0:(n - 1L))[i] 
if(DN) dn <- dn[i] 
} else { ## character 
if(!has.dn) 
    stop("no 'dimnames[[.]]': cannot use character indexing") 
i0 <- match(i, dn) 
if(anyNA(i0)) stop("invalid character indexing") 
if(DN) dn <- dn[i0] 
i0 <- i0 - 1L 
} 
if(!give.dn) i0 else list(i0 = i0, dn = dn) 
} ## {intI} 
Смежные вопросы