R:使用新数据重新创建相同的文档术语矩阵

时间:2016-06-30 05:54:50

标签: r svm training-data dfm quanteda

我在帖子中有完全相同的问题,除了我使用#quanteda为svm模型生成dfm(因为我需要有完全相同的dfms进行交叉验证预测)How to recreate same DocumentTermMatrix with new (test) data

然而,我的训练集(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

任何人都可以帮我吗?我已经挣扎了两天而且我已经接近完成了!谢谢!

1 个答案:

答案 0 :(得分:0)

这个答案仍然有点粗糙,但我认为这可能是问题所在。看起来你正在使用Tsparse.R包。它有一个函数intI()。函数intI()在帖子的底部定义。这是您的错误发生的地方。但是,您可以完全避免使用该功能。请考虑以下事项:

似乎protocoltfidf是原始数据集。代码段的第二行从protocoltfidf中提取测试数据集中 not 的列名。所以“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}