如何从R中的旧列表创建一个包含每个矩阵列的新列表?

时间:2018-11-09 05:59:51

标签: r list for-loop matrix combinations

我尝试创建一个包含旧列表中每个矩阵列的新列表。例如:

var_names <- c('a', 'b', 'c', 'd')
var_combi <- list()
for(i in 1:length(var_names)) {var_combi[[i]] <- combn(var_names[1:length(var_names)],i)}
c(var_combi)

然后我得到一个如下列表对象。每个列出的项目都是一个矩阵:

[[1]]
     [,1] [,2] [,3] [,4]
[1,] "a"  "b"  "c"  "d" 

[[2]]
     [,1] [,2] [,3] [,4] [,5] [,6]
[1,] "a"  "a"  "a"  "b"  "b"  "c" 
[2,] "b"  "c"  "d"  "c"  "d"  "d" 

[[3]]
     [,1] [,2] [,3] [,4]
[1,] "a"  "a"  "a"  "b" 
[2,] "b"  "b"  "c"  "c" 
[3,] "c"  "d"  "d"  "d" 

[[4]]
     [,1]
[1,] "a" 
[2,] "b" 
[3,] "c" 
[4,] "d" 

我想创建一个新列表new_list,如下所示,例如

[[1]]
[1] "a"

[[2]] 
[1] "b"

[[3]] 
[1] "c" 

[[4]]
[1] "d" 

[[5]]
[1]  "a" "b"

[[6]]
[1]  "a" "c"

以便我可以遍历它们或使用lapply使用mydata从数据集mydata[names(mydata) %in% new_list[[i]]]中选择那些变量。

现在,我正在努力创建new_list,并且找不到合适的解决方案(我尝试过unlistcappend)。如果必须使用for循环,如何在此处循环遍历列表和列出的矩阵列?

2 个答案:

答案 0 :(得分:2)

如果您不介意使用功能性方法而不是循环,则可以解决问题:

library(dplyr)
library(purrr)

c(var_combi) %>%
  map(t) %>%
  map(~ split(., 1:nrow(.))) %>%
  unlist(recursive = F)

答案 1 :(得分:2)

这是使用template <class T> class myTemplate; // forward declaration template <class T> std::ostream& operator<<(std::ostream& out, const myTemplate<T> &obj); template <class T> class myTemplate { private: using Key = T; private: template <class Type = T> struct Thing { Type data; Thing() = default; Thing(const Key Num) : data(Num) {} }; private: Thing<> A; Thing<> *B = nullptr; public: myTemplate(const Key Num) : A(Thing<>(Num)), B(&A) {} friend std::ostream & operator<<<>(std::ostream& out, const myTemplate &obj); }; template <class T> std::ostream & operator<<(std::ostream& out, const myTemplate<T> &obj) { return out << obj.A.data << std::endl << obj.B->data << std::endl; } 的简单方法:

base R

这是OP代码的较小修改。我们在这里使用unlist(lapply(seq_along(var_names), function(x) { combn(var_names, x, simplify = FALSE) }), recursive = FALSE) [[1]] [1] "a" [[2]] [1] "b" [[3]] [1] "c" [[4]] [1] "d" [[5]] [1] "a" "b" [[6]] [1] "a" "c" . . ### 9 more elements . 而不是for循环,并且还在lapply中设置simplify = FALSE(默认为combn)。如果为simplify = TRUE,则此参数将结果保留为请求的列表格式。您还将注意到,我们将FALSEunlist一起使用,它将在第一级之后停止不公开。

如果您确实想要简洁,我们可以使用rescursive = FALSE库中的powerset函数。我们必须谨记,我们需要删除与空集等效的第一个元素:

rje