我有一组包含空格分隔元素的字符串。我想构建一个矩阵,它会告诉我哪些元素是哪些字符串的一部分。例如:
""
"A B C"
"D"
"B D"
应该给出如下内容:
A B C D
1
2 1 1 1
3 1
4 1 1
现在我有了一个解决方案,但它像糖蜜一样运行缓慢,而且我已经没有关于如何让它更快的想法:
reverseIn <- function(vector, value) {
return(value %in% vector)
}
buildCategoryMatrix <- function(valueVector) {
allClasses <- c()
for(classVec in unique(valueVector)) {
allClasses <- unique(c(allClasses,
strsplit(classVec, " ", fixed=TRUE)[[1]]))
}
resMatrix <- matrix(ncol=0, nrow=length(valueVector))
splitValues <- strsplit(valueVector, " ", fixed=TRUE)
for(cat in allClasses) {
if(cat=="") {
catIsPart <- (valueVector == "")
} else {
catIsPart <- sapply(splitValues, reverseIn, cat)
}
resMatrix <- cbind(resMatrix, catIsPart)
}
colnames(resMatrix) <- allClasses
return(resMatrix)
}
分析函数给了我这个:
$by.self
self.time self.pct total.time total.pct
"match" 31.20 34.74 31.24 34.79
"FUN" 30.26 33.70 74.30 82.74
"lapply" 13.56 15.10 87.86 97.84
"%in%" 12.92 14.39 44.10 49.11
所以我的实际问题是: - 花在“乐趣”上的 33% 来自哪里?- 有什么方法可以加快 %in% 的通话速度吗?
我尝试在进入循环之前将字符串转换为因子,以便匹配数字而不是字符串,但这实际上会使 R 崩溃。我还尝试进行部分矩阵分配(IE,resMatrix[i,x] <- 1),其中 i 是字符串的编号,x 是因子的向量。那里也没有骰子,因为它似乎一直在无限运行。