【问题标题】:Extract xyz values from list of lists in R从 R 中的列表列表中提取 xyz 值
【发布时间】:2020-11-03 11:04:59
【问题描述】:

我想从 R 中的(命名)列表中提取值。

示例

数据如下:

data <- list('1' = list(x = c(1,2,3), y = c(2,3,4), z = c(2,3,7)), 
                '2' = list(x = c(2,3,4,5), y = c(3,4,5,6), z = c(1,2,3,5)))

从指定的列表(例如,'1')中,我想从列表中提取所有第一个/第二个/等元素。元素索引的选择应该是随机的。

例如,如果我想从第一个列表(即'1')中采样,我会生成一个随机索引并提取与该随机索引对应的 x、y 和 z 值。假设索引是2,那么元素应该是x=2y=3z=3

接近

我认为一个函数应该能够完成这项工作。第一步是从函数中调用列表:

这行得通:

x <- function(i){
    data$`1`
}
x(1)

但这不是:

x <- function(i){
        data$`i`
    }
    x(1)

问题

如何从函数中调用命名列表的列表?以及对所选索引对应的数据进行采样最方便的方法是什么?

【问题讨论】:

  • 1) 在你的函数中使用data[[i]]。 2)像这样调用该函数x("1")

标签: r list


【解决方案1】:

你需要这样的东西吗?

get_elements <- function(data, i) {
  #select the main list
  tmp <- data[[i]]
  #Check the length of each sublist, select minimum value
  #and sample 1 number from 1 to that number
  rand_int <- sample(min(lengths(tmp)), 1)
  #select that element from each sub-list
  sapply(tmp, `[[`, rand_int)
}

get_elements(data, 1)

【讨论】:

    【解决方案2】:

    如果我正确理解您的问题,解决方案将是“purrr”包:

    library(purrr)
    # list "name"
    i <- '1'
    # index
    j <- 2
    
    # to get the needed info as a list:
    purrr::map(data[[i]], ~ .x[j])
    
    # to get the needed info as a data.frame:
    purrr::map_df(data[[i]], ~ .x[j])
    

    【讨论】:

    • 谢谢,一个优雅的部分解决方案,但(还)不完全适合这个问题。每个“主”列表的列表长度不同,因此,我需要一种方法来首先检查子列表的长度,然后生成一个随机整数以从列表中采样。
    • 可以用这个语句查看长度:length(data[[i]])
    • 或者如果您的意思是“子子列表”可能具有不同的长度,那么这将是获得最小的选项: min(purrr::map_int(data[[i]] , ~ 长度(.x)))
    猜你喜欢
    • 2021-02-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-14
    • 2020-02-13
    • 1970-01-01
    • 2016-07-26
    相关资源
    最近更新 更多