これはかなり興味深い問題のように見えましたが、誤解したために興味深いように見えただけかもしれません。ここで得た解決策は、サブベクトルを作成length of character vector / frequency of most frequent item
し、各文字列をf
それらのサブベクトルに入れます。ここf
で、その文字列の頻度です。これは、実際に求めていたものよりもおそらく複雑です。
library(plyr)
# I created a file with 10000 random strings and a roughly similar frequency
# distribution using python, and now I can't remember exactly what I did
strings <- read.csv("random_strings.txt", header=FALSE,
stringsAsFactors=FALSE)$V1
freq_table <- table(strings)
num_sub_vectors <- max(freq_table)
# Create a list of empty character vectors
split_list <- alply(1:num_sub_vectors, 1, function(x) return(character(0)))
for (s in names(freq_table)) {
# Put each string into f of the sub-vectors, where f is the string's
# frequency
freq <- freq_table[[s]]
# Choose f random indexes to put this string into
sub_vecs <- sample(1:num_sub_vectors, freq)
for (sub in sub_vecs) {
split_list[[sub]] <- c(split_list[[sub]], s)
}
}
それが機能したことをテストするには、文字列s
または頻度を選択し、サブベクトルで発生するf
ことを確認します。自信が持てるまで繰り返します。s
f
> head(freq_table[freq_table==15])
strings
ad ak bj cg cl cy
15 15 15 15 15 15
> sum(sapply(split_list, function(x) "ad" %in% x))
[1] 15