我尝试创建一个包含旧列表中每个矩阵列的新列表。例如:
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
,并且找不到合适的解决方案(我尝试过unlist
,c
和append
)。如果必须使用for
循环,如何在此处循环遍历列表和列出的矩阵列?
答案 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
,则此参数将结果保留为请求的列表格式。您还将注意到,我们将FALSE
与unlist
一起使用,它将在第一级之后停止不公开。
如果您确实想要简洁,我们可以使用rescursive = FALSE
库中的powerset
函数。我们必须谨记,我们需要删除与空集等效的第一个元素:
rje