如何使用 R 通过向量的迭代或组合来构造输入字符串?
How do I construct an input string by iteration or combinations through a vector using R?
我正在尝试构建一个字符串向量作为模型测试的输入(它最终进入 lmer 函数)。我必须针对不同的测试对列进行大量更改,因此在开始时通过在一个地方声明它们来执行此操作确实会加快该过程。
向量(字符串)由列标题(来自数据)组成。
目前有两个固定的起点,然后我想遍历可用的列选项而不重复并且顺序不重要。
示例输入:
first_col <- "SpA"
secondFixedcol <- "SpecB"
other_cols <- c("C", "D", "E", "F") #This can have any number of parameters
模型文本的示例输出:
modelsText <- c('SpecB',
'SpA + SpecB',
'SpA + SpecB + C',
'SpA + SpecB + D',
'SpA + SpecB + E',
'SpA + SpecB + F',
'SpA + SpecB',
'SpA + SpecB + C + D',
'SpA + SpecB + C + E',
'SpA + SpecB + C + F',
'SpA + SpecB + C + D + E',
'SpA + SpecB + C + D + F',
'SpA + SpecB + C + D + E + F')
我的想法是试图告诉我使用粘贴功能构建某种科学怪人 For 循环(在这个阶段我仍然无法理解),但是使用矢量化一定有更优雅的东西吗?
我的另一个想法是使用combinations(4, 3, other_cols, repeats.allowed = FALSE)
然后使用嵌套的 For 循环遍历它?
从 、
中汲取灵感
combos = do.call(c, lapply(seq_along(other_cols), function(y) {
arrangements::combinations(other_cols, y, layout = "l")
}))
formulas = sapply(combos, paste, collapse = " + ")
formulas = paste(first_col, secondFixedcol, formulas, sep = " + ")
formulas
# [1] "SpA + SpecB + C" "SpA + SpecB + D" "SpA + SpecB + E"
# [4] "SpA + SpecB + F" "SpA + SpecB + C + D" "SpA + SpecB + C + E"
# [7] "SpA + SpecB + C + F" "SpA + SpecB + D + E" "SpA + SpecB + D + F"
# [10] "SpA + SpecB + E + F" "SpA + SpecB + C + D + E" "SpA + SpecB + C + D + F"
# [13] "SpA + SpecB + C + E + F" "SpA + SpecB + D + E + F" "SpA + SpecB + C + D + E + F"
我会留给你添加不涉及任何 other_cols
的公式 - 只需在前面加上 c()
就可以了。
我正在尝试构建一个字符串向量作为模型测试的输入(它最终进入 lmer 函数)。我必须针对不同的测试对列进行大量更改,因此在开始时通过在一个地方声明它们来执行此操作确实会加快该过程。
向量(字符串)由列标题(来自数据)组成。 目前有两个固定的起点,然后我想遍历可用的列选项而不重复并且顺序不重要。
示例输入:
first_col <- "SpA"
secondFixedcol <- "SpecB"
other_cols <- c("C", "D", "E", "F") #This can have any number of parameters
模型文本的示例输出:
modelsText <- c('SpecB',
'SpA + SpecB',
'SpA + SpecB + C',
'SpA + SpecB + D',
'SpA + SpecB + E',
'SpA + SpecB + F',
'SpA + SpecB',
'SpA + SpecB + C + D',
'SpA + SpecB + C + E',
'SpA + SpecB + C + F',
'SpA + SpecB + C + D + E',
'SpA + SpecB + C + D + F',
'SpA + SpecB + C + D + E + F')
我的想法是试图告诉我使用粘贴功能构建某种科学怪人 For 循环(在这个阶段我仍然无法理解),但是使用矢量化一定有更优雅的东西吗?
我的另一个想法是使用combinations(4, 3, other_cols, repeats.allowed = FALSE)
然后使用嵌套的 For 循环遍历它?
从
combos = do.call(c, lapply(seq_along(other_cols), function(y) {
arrangements::combinations(other_cols, y, layout = "l")
}))
formulas = sapply(combos, paste, collapse = " + ")
formulas = paste(first_col, secondFixedcol, formulas, sep = " + ")
formulas
# [1] "SpA + SpecB + C" "SpA + SpecB + D" "SpA + SpecB + E"
# [4] "SpA + SpecB + F" "SpA + SpecB + C + D" "SpA + SpecB + C + E"
# [7] "SpA + SpecB + C + F" "SpA + SpecB + D + E" "SpA + SpecB + D + F"
# [10] "SpA + SpecB + E + F" "SpA + SpecB + C + D + E" "SpA + SpecB + C + D + F"
# [13] "SpA + SpecB + C + E + F" "SpA + SpecB + D + E + F" "SpA + SpecB + C + D + E + F"
我会留给你添加不涉及任何 other_cols
的公式 - 只需在前面加上 c()
就可以了。