【问题标题】:how to generate without repeating the combination in R using the function combn() and generalize the code?如何生成而不使用函数combn()在R中重复组合并概括代码?
【发布时间】:2021-09-26 05:13:00
【问题描述】:

嘿,我有这个:

list(
myvector_a=c("X1","X2","X3"),
myvector_b=c("X1","X3","X4"),
myvector_c=c("X2","X5","X6"))->mydata

预期输出: 手动构建

list(
  myvector_a=list(c_1_1=myvector_a[[1]],
                  c_1_2=myvector_a[[2]],
                  c_1_3=myvector_a[[3]],
                  c_2_1=c(myvector_a[[1]],myvector_a[[2]]),
                  c_2_1=c(myvector_a[[1]],myvector_a[[3]]),
                  c_2_1=c(myvector_a[[2]],myvector_a[[3]]),
                  c_3_1=c(myvector_a[[1]],myvector_a[[2]],myvector_a[[3]])),
  myvector_b=list(c_1_1=myvector_b[[1]],
                  c_1_2=myvector_b[[2]],
                  c_1_3=myvector_b[[3]],
                  c_2_1=c(myvector_b[[1]],myvector_b[[2]]),
                  c_2_1=c(myvector_b[[1]],myvector_b[[3]]),
                  c_2_1=c(myvector_b[[2]],myvector_b[[3]]),
                  c_3_1=c(myvector_b[[1]],myvector_b[[2]],myvector_b[[3]])),
  myvector_c=list(c_1_1=myvector_c[[1]],
                  c_1_2=myvector_c[[2]],
                  c_2_1=c(myvector_c[[1]],myvector_c[[2]])))->result

这是我最接近我需要的解决方案:

x<-NULL
for(i in 1:3)
  for(j in 1:length(mydata[[i]]))
    combn(mydata[[i]],j) -> result[[paste0(names(mydata[i]))]][[paste0("c_",i,"_",j)]]

例如,在得到的输出中:result[["myvector_a"]][["c_1_2"]] 我无法像在预期输出中那样分离:result[["myvector_a"]][["c_2_1"]] , 结果[["myvector_a "]][["c_2_2"]] 和结果[["myvector_a"]][["c_2_3"]]。

预期输出:                                                                                          获得的输出:

【问题讨论】:

    标签: r combinations


    【解决方案1】:

    这是在lapply 中使用lapply 的方法-

    result <- lapply(mydata, function(x) {
      unlist(lapply(seq_along(x), function(y) combn(x, y, list)), recursive = FALSE)
    })
    


    使用listunlist 只是为了获得所需的输出结构。如果您不太关心它,这也可以。

    result <- lapply(mydata, function(x) lapply(seq_along(x), function(y) combn(x, y)))
    

    【讨论】:

    • 您好,我运行了您的建议代码,但您得到的输出与我的预期输出或您输出的图像结果不同。
    • 您的意思是使用您帖子中的数据并使用我帖子中的第一个答案不会给您提供如图所示的相同输出?
    • 抱歉,cmets 中的格式不明确。 lengths(result) 会为您返回什么?在此示例中,所有这些都应为 7。我重新启动了 R 并再次检查了答案。它提供了我所展示的内容。
    • 对不起,我也重置了,现在我重置了!感激不尽
    【解决方案2】:

    我们可以使用base R中的outer

    out <- c(outer(seq_along(mydata), seq_along(mydata), 
       FUN = Vectorize(function(i, j) combn(mydata[[i]], j, FUN = list))))
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2010-12-15
      • 2022-01-23
      • 1970-01-01
      • 2020-07-14
      • 1970-01-01
      • 2014-07-20
      • 1970-01-01
      相关资源
      最近更新 更多