在R中检索拆分列表的ID

时间:2013-11-25 17:02:29

标签: r list split

说我有一个列表,如下:

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?

3 个答案:

答案 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