我在帖子中有完全相同的问题,除了我使用#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
任何人都可以帮我吗?我已经挣扎了两天而且我已经接近完成了!谢谢!
答案 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}