创建无意义的词 - 在 R 中使用具有三个以上维度的 outer()

Posted

技术标签:

【中文标题】创建无意义的词 - 在 R 中使用具有三个以上维度的 outer()【英文标题】:Creating nonsense words - using outer() with three+ dimensions in R 【发布时间】:2013-06-02 09:16:30 【问题描述】:

我正在根据第一个辅音、元音、最终辅音的列表创建无意义的单词:

initial_consonants <- c("r", "w", "h", "sp", "st", "sk")
vowels <- c("i", "u", "I", "U", "E", "V", "@")
final_consonants <- c("f", "ts", "rS", "rv", "rl", "Dz", "lts", "bz")

在给定这组首辅音、元音和尾辅音的情况下,我想获得所有可能的 (6*7*8 = 336) 个无意义词。我为此创建了这个函数:

create_CVC_words <- function(initial_consonant, vowel, final_consonant)
paste(initial_consonant, vowel, final_consonant, sep = "") -> CVC_word

但我不知道如何应用它以便将所有三个维度都考虑在内。 outer() 给了我首辅音和元音的组合,最终辅音变化:

outer(initial_consonants, vowels, final_consonants, FUN = create_CVC_words) -> table
table
     [,1]    [,2]    [,3]    [,4]     [,5]    [,6]    [,7]   
[1,] "rif"   "rults" "rIrl"  "rUrS"   "rEf"   "rVlts" "r@rl" 
[2,] "wits"  "wubz"  "wIDz"  "wUrv"   "wEts"  "wVbz"  "w@Dz" 
[3,] "hirS"  "huf"   "hIlts" "hUrl"   "hErS"  "hVf"   "h@lts"
[4,] "spirv" "sputs" "spIbz" "spUDz"  "spErv" "spVts" "sp@bz"
[5,] "stirl" "sturS" "stIf"  "stUlts" "stErl" "stVrS" "st@f" 
[6,] "skiDz" "skurv" "skIts" "skUbz"  "skEDz" "skVrv" "sk@ts"

但我需要的是拥有所有可能的组合,即:

rif rits rirS rirv rirl riDz rilits ribz
ruf ruts rurS ...
.
.
.
wif wits ...

我如何使用/调整我的函数来做到这一点?我还需要对较大的无意义词执行此操作,即双音 CVCVC,因此我需要能够考虑的维度数不限于三个。

编辑:刚刚看到关于如何让 outer() 在这里取 n 维的一般问题:How to generalize outer to n dimensions? 但无法为我的问题实施那里给出的解决方案。

【问题讨论】:

【参考方案1】:

您可以使用expand grid 创建所有不同的组合:

apply(expand.grid(initial_consonants, vowels, final_consonants), 1, function(x)create_CVC_words(x[1], x[2], x[3]))

这是你想要的吗?

【讨论】:

是的!字符串的格式也是我想要的格式——谢谢!【参考方案2】:
do.call(paste0, expand.grid(initial_consonants, vowels, final_consonants))

【讨论】:

【参考方案3】:

此方法需要更多编码,但坚持使用您原来的outer,这意味着它比其他两个响应更快,因为expand.grid 几乎总是比outer 慢:

ends <- outer(vowels, final_consonants, paste0)
endsL <- lapply(1:nrow(ends), function(i) ends[i, ])
unlist(lapply(endsL, function(x) outer(initial_consonants, x, paste0)))

【讨论】:

以上是关于创建无意义的词 - 在 R 中使用具有三个以上维度的 outer()的主要内容,如果未能解决你的问题,请参考以下文章

R语言数组数据框因子

Matlab的多维数组操作

创建“Nokogiri::XML”或“Nokogiri::HTML”对象时如何避免创建无意义的空白文本节点

为啥在 MASM 汇编中使用 FPU x87 指令集执行操作时得到无意义的数字?

R语言数组array函数

函数总是返回无意义的值