【问题标题】:Retrieving ids of splitted list in R在R中检索拆分列表的ID
【发布时间】:2013-11-25 17:02:29
【问题描述】:

假设我有一个列表,如下所示:

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?

【问题讨论】:

  • 如果您使用数据框而不仅仅是列表,这将非常容易。有什么理由必须列出所有内容吗?
  • @joran:是的,我实际上有几个数组,所以我不能真正使用数据框(相应地修改了示例)。

标签: r list split


【解决方案1】:

这是查找 ID 的一种方法:

IDs <- seq_along(my.list) # generate a vector of IDs

IDs.split <- split(IDs, loc) # split the IDs along loc

这将返回一个列表,其中包含每个 location 的 ID 向量。

【讨论】:

  • 我知道有一个简单的解决方案!
【解决方案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

【讨论】:

  • 这也是个好主意,虽然我猜@Sven 解决方案更容易管理(至少对于我的特定任务而言)。
【解决方案3】:

如果出于某种原因您不想先设置 ID,则另一种方法:

match(unlist(my.list.split, FALSE), my.list)

然后,您可以使用 names() 或其他任何方式设置名称(如果您正在尝试这样做)。


split() 根据loc 将您的列表划分为嵌套列表。 unlist() 将recursive 设置为FALSE 将从my.list.split 中删除项目,以便它们与my.list 具有相同的形状。那么你所要做的就是match()他们来查看哪些项目引用了原始对象中的哪些索引。

匹配正确的证明(应该返回TRUE,除非我犯了一个可怕的错误):

ul <- unlist(my.list.split, FALSE)
m <- match(ul, my.list)
identical(my.list[m], unname(ul))

【讨论】:

    猜你喜欢
    • 2018-07-23
    • 1970-01-01
    • 2012-07-24
    • 2017-05-20
    • 2018-05-30
    • 2016-09-01
    • 1970-01-01
    • 1970-01-01
    • 2016-11-10
    相关资源
    最近更新 更多