【问题标题】:Find all combinations of two vectors as a new vector找到两个向量的所有组合作为新向量
【发布时间】:2018-09-05 14:15:53
【问题描述】:

我有两个向量:

x <- c('Q1', 'Q2', 'Q3')

y <- c('Yes', 'No')

基于这些向量,我想创建一个数据框,其中每一行都是一个向量,其中问题(Q1、Q2、Q3)按照它们在向量 x 中的顺序位于奇数位置,而答案(是,否) 在偶数位置上,我需要所有可能的组合:

'Q1', 'Yes', 'Q2', 'Yes', 'Q3', 'Yes'
'Q1', 'Yes', 'Q2', 'Yes', 'Q3', 'No'
'Q1', 'Yes', 'Q2', 'No', 'Q3',  'Yes'

等等……

我该怎么做?

【问题讨论】:

    标签: r


    【解决方案1】:

    一种选择是

    expand.grid(combn(x, 2, FUN = list), y)
    

    上面创建了一个list 列和一个普通列。如果我们需要matrix

    do.call(rbind, do.call(Map, c(f = c, expand.grid(combn(x, 2, 
               FUN = list), y, stringsAsFactors = FALSE))))
    

    【讨论】:

    • 谢谢,但是我得到了一个 3 列的矩阵,我需要一个 6 列的矩阵。可能是这样的:Q1 是/否 Q2 是/否 Q3 是/否
    • 您在预期中显示的输出不是 R 结构
    【解决方案2】:

    这就是你所追求的吗?

    ans <- expand.grid(rep(list(c("Yes", "No")), 3))
    qst <- as.data.frame(sapply(x, function(i) rep(i, nrow(ans))))
    
    ret <- cbind(qst, ans)
    ret[as.numeric(sapply(1:length(x), function(i) c(i, i + length(x))))]
    #  Q1 Var1 Q2 Var2 Q3 Var3
    #1 Q1  Yes Q2  Yes Q3  Yes
    #2 Q1   No Q2  Yes Q3  Yes
    #3 Q1  Yes Q2   No Q3  Yes
    #4 Q1   No Q2   No Q3  Yes
    #5 Q1  Yes Q2  Yes Q3   No
    #6 Q1   No Q2  Yes Q3   No
    #7 Q1  Yes Q2   No Q3   No
    #8 Q1   No Q2   No Q3   No
    

    最后两行执行以下操作:

    1. 列绑定问题和答案。
    2. 重新排列列,使问题和答案交替出现。 as.numeric(sapply(1:length(x), function(i) c(i, i + length(x)))) 返回 1 4 2 5 3 6,它给出了要排序的列的索引向量。

    【讨论】:

    • 代码运行得很好,但我不太明白最后一行,你能帮我澄清一下吗?
    • @hoze 我添加了一些关于最后两个步骤的解释。请看一看。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-10-25
    • 1970-01-01
    • 2019-11-11
    相关资源
    最近更新 更多