スペースで区切られた要素を含む文字列のセットがあります。どの要素がどの文字列の一部であったかを教えてくれるマトリックスを作成したいと思います。例えば:
""
"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
だから私の実際の質問は次のようになります: - %in% 呼び出しを高速化する方法はありますか?
ループに入る前に文字列を因数に変換して、文字列の代わりに数字を一致させようとしましたが、実際には R がクラッシュします。また、部分行列代入 (IE、resMatrix[i,x] <- 1) を試みました。ここで、i は文字列の番号で、x は要素のベクトルです。無限に動き続けるように見えるので、サイコロもありません。