我正在尝试使用 R 基础来划分这个问题的子集。我有一个名称列表,我想将其按嵌套索引列表进行子集化。 名称列表非常紧凑和直接,索引列表是嵌套的,并且索引可能有跳跃,即某些数字可以不连续;每个子列表从 1 开始计数。
ListOfIndices
的数据是这样的:
ListOfIndices<-list(
Chr1 <- list(c(1,2,3,4,5,6), c(7,8,9,10), c(11,12)),
Chr2 <- list(c(4,5), c(7,8,9,10)),
Chr3 <- list(c(1,2,3), c(5,6,7,8,9), c(10,11), c(14,15,16))
)
就像这样
ListOfNames
:
ListOfNames<-list(
Chr1 <- c("A","B","C","D","E","F","G","H","I","J","K","L","M","N","O","P","Q","R","S","T","U","V","W","X","Y","Z","A1","B2","C3","D4","E1","F2","G3","H4","I1"),
Chr2 <- c("a","b","c","d","e","f","g","h","i","j","k","l","m","n","o","p","q","r","s","t","u","v","w","x","y","z","a1","b2","c3","d4","e5","f6","g7","h8","i9","j10","k11","l12","m13","n14","o15","p16","q17","r18","s19","t20","u1","v2","w3","x4","y5","z6"),
Chr3 <- c("aA","bB","cC","dD","eE","fF","gG","hH","iI","jJ","kK","lL","mM","nN","oO","pP","qQ","rR","sS","tT","uU","vV","wW","xX","yY","zZ"))
我想要得到的是一个
ListOfIndicisedNames
:
ListOfIndicisedNames<-list(
Chr1 <- list(c("A","B","C","D","E","F"),c("G","H","I","J"),c("K","L")),
Chr2 <- list(c("d","e"), c("g","h","i","j")),
Chr3 <- list(c("aA","bB","cC"), c("eE","fF","gG","hH","iI"), c("jJ","kK"),c("nN","oO","pP"))
)
我尝试了几种口味的
lapply()
和sapply()
,尽管我没能得到do.call()
——每当我设法让它发挥作用时,我仍然发现它非常神奇。
我认为另一种方法可以通过
for
循环来获取结果,其中 i
和 j
分别用于列表和子列表,但每一次尝试都让 R 生气。
有人可以帮助我进入这个迷宫吗?
Map()
迭代索引和名称。
Map(
\(nm, index_list)
lapply(index_list, \(i, l) l[i], l = nm), ListOfNames, ListOfIndices
)
如果将其分配给名为
out
的变量,我们可以检查它是否会产生所需的结果:
identical(ListOfIndicisedNames, out)
# [1] TRUE
由于名称列表和索引列表的长度相同,因此可以使用
mapply
均匀地迭代它们,然后可以使用 lapply
迭代每个子列表
mapply(function(indexes,names) {
lapply(indexes,function(indexes,names) { names[indexes] },names=names)
},indexes=ListOfIndices,ListOfNames)
另外,该示例表明您要为列表分配名称?尝试使用“=”而不是“<-" within the list definition:
ListOfIndices<-list(
Chr1 = list(c(1,2,3,4,5,6), c(7,8,9,10), c(11,12)),
Chr2 = list(c(4,5), c(7,8,9,10)),
Chr3 = list(c(1,2,3), c(5,6,7,8,9), c(10,11), c(14,15,16))
)