如何遍历嵌套列表并返回单列表?解决R中mtcars列去重结果被覆盖问题
问题描述
我有一个dataframe,希望选取特定列并对这些列应用unique函数,得到一个包含各列唯一值向量的列表。本文以mtcars数据集为例:
首先创建两个包含待遍历列索引的列表:
seq1 <- list(1:3) seq2 <- list(9:11)
接着创建包含这两个列表的嵌套列表:
cols <- c(seq1, seq2)
最后编写代码遍历该嵌套列表,将其中的列索引用于调用unique函数:
i<-0 #create iterating value mylist <- list() #create empty list for (num in seq_along(cols)){ i<- i+1 m <- unique(mtcars[num]) #create the element to be added mylist[[i]]<- m #add each element to list } #creates a list of vectors
我期望得到一个包含4个dataframe的列表,分别对应seq1和seq2中的每一列索引。目前代码能成功处理seq2(得到对应列唯一值的2个dataframe),但seq1生成的列表会被seq2覆盖,请问该修改哪部分代码?
解决方案
问题出在嵌套列表的遍历逻辑上:
cols是包含2个元素的嵌套列表(每个元素是一组列索引),seq_along(cols)只会生成1、2两个迭代值,循环仅执行2次。第一次循环处理cols[[1]](1:3)时,mtcars[num]取的是第1到3列的组合dataframe,unique返回的是这三列组合后的唯一值;第二次循环处理cols[[2]](9:11),直接覆盖了第一次的结果,最终mylist只有2个元素,而非预期的4个。
可以通过两种方式修改:
方式一:展开嵌套列表为一维列索引向量
先把所有目标列索引合并成一维向量,再逐个遍历:
# 展开嵌套列表为一维向量 all_cols <- unlist(cols) mylist <- list() for (col_idx in all_cols) { # 若需要单列向量则用mtcars[[col_idx]],需要dataframe则用mtcars[col_idx] mylist[[length(mylist) + 1]] <- unique(mtcars[col_idx]) }
方式二:嵌套遍历处理每个子列表
保留原嵌套结构的遍历逻辑,用两层循环逐个处理列索引:
mylist <- list() i <- 0 for (sub_list in cols) { for (col_idx in sub_list) { i <- i + 1 mylist[[i]] <- unique(mtcars[col_idx]) } }
内容的提问来源于stack exchange,提问作者plast1cd0nk3y
相关产品推荐
相关产品推荐

