说我有一个列表,如下:
my.list <- list()
for (i in 1:100)
{
my.list[[i]] <- list(location = sample(paste0("Location", 1:5), 1, replace=T),
val1 = runif(100),
val2 = runif(30))
}
现在我按位置拆分
loc <- sapply(my.list, function(x){x$location})
my.list.split <- split(my.list, loc)
有没有办法将my.list.split
的每个元素与原始my.list
相关联,即在my.list
中找到其ID?
答案 0 :(得分:3)
以下是查找ID的一种方法:
IDs <- seq_along(my.list) # generate a vector of IDs
IDs.split <- split(IDs, loc) # split the IDs along loc
这将返回一个列表,其中包含每个location
的ID向量。
答案 1 :(得分:2)
如果您为my.list
提供了一些名称,那么您的my.list.split
也会有名称,如有必要,您可以使用这些名称进行参考。
# Syntactically different, but functionally equivalent way of creating the list.
my.list<- lapply(1:100,function(x) list(location = sample(paste0("Location", 1:5), 1, replace=T),
val1 = runif(100),
val2 = runif(30)))
names(my.list)<-paste0('id_',seq_along(my.list)) # Added
loc <- sapply(my.list, function(x){x$location})
my.list.split <- split(my.list, loc)
所以,现在一切都有一个唯一的ID:
my.list.split[[1]]
# $id_11
# $id_11$location
# [1] "Location1"
#
# $id_11$val1
# [1] 0.997154684 0.348063634 0.373797808 0.569167679 0.417461443 0.799423830 0.147882721
# [8] 0.489438012 0.292867337 0.072622654 0.583932815 0.060452664 0.083562011 0.613114462
# ....
# $id_11$val2
# [1] 0.68983774 0.41056046 0.18620312 0.61078253 0.85947881 0.50736945 0.01362270 0.70022800
答案 2 :(得分:1)
另一种方法,如果由于某种原因你不想先设置ID:
match(unlist(my.list.split, FALSE), my.list)
然后,您可以使用names()
或其他任何设置来设置名称。
split()
根据loc
将您的列表划分为嵌套列表。将unlist()
设置为recursive
的{{1}}会从FALSE
中移除这些项目,以使它们与my.list.split
形状相同。然后你要做的只是my.list
他们看看哪些项引用了原始对象中的索引。
证明比赛是正确的(除非我犯了一个可怕的错误,否则应该返回match()
):
TRUE