【问题标题】:How to access variable length lists inside a list in R如何访问R中列表中的可变长度列表
【发布时间】:2017-03-08 05:39:37
【问题描述】:

当我在数据框的一列上调用 strsplit() 时,根据 strsplit() 的结果,有时会得到一个或两个“子列表”作为拆分的结果。例如,

v <- c("50", "1 h 30 ", "1 h", NA)
split <- strsplit(v, "h")
[[1]]
[1] "50"

[[2]]
[1] "1"   " 30"

[[3]]
[1] "1 "

[[4]]
[1] NA

我知道我可以使用“[]”访问单独的拆分列表,“[[]]”告诉我这些子列表的内容,所以我想我明白这一点。而且我可以通过 split[[2]][2] 访问 [[2]] 中的“30”。

不幸的是,我不知道如何以编程方式访问我拥有的整个专栏。我正在尝试将列转换为数字数据。但是那个“1 h 30”的案例给我带来了很多麻烦。

func1 <- function(x){
  split.l <- strsplit(x, "h")
  len <- lapply(split.l, length)
  total <- ifelse(len == 2, as.numeric(split.l[2]) + as.numeric(split.l[1]) * 60, as.numeric(split.l[2])) 
  return(total)
}

v <- ifelse(grepl("h", v), func1(v), as.numeric(v))

我知道 len 返回分割长度的向量。但是当涉及到实际访问该单个子列表的第二个元素时,我根本不知道如何正确地做到这一点。这将产生一个错误,因为 split.l[1] 和 split.l[2] 每次只会返回整个原始数据帧列的前两个元素。 [[1]] 和 [[2]] 也不起作用。我需要类似 [[i]][1] 和 [[i]][2] 的东西。但我试图不使用 for 循环和迭代。

长话短说,我如何以编程方式访问内部列表元素

作为参考,我确实看过这有帮助。但我仍然无法解决它。 apply strsplit to specific column in a data.frame

我在 R 中的列表和列表处理方面真的很苦恼,因此感谢您提供任何帮助。

【问题讨论】:

    标签: r


    【解决方案1】:

    一个常见的成语是lapply(l,[, 2),应用于您的示例给出:

    > lapply(split, `[`, 2)
    [[1]]
    [1] NA
    
    [[2]]
    [1] " 30 "
    
    [[3]]
    [1] NA
    
    [[4]]
    [1] NA
    

    sapply() 会尽可能将其折叠为向量。

    正在做的是lapply() 依次获取split 的每个组件——这是你的伪代码的[[i]] 位——以及我们想要提取nth 元素的每个组件。我们通过应用带有参数n[ 函数来做到这一点——在本例中为2L

    如果你想要第一个元素,除非有第二个元素,在这种情况下取​​第二个,你可以只写一个包装器而不是直接使用[

    wrapper <- function(x) {
        if(length(x) > 1L) {
            x[2L]
        } else {
            x[1L]
        }
    }
    
    lapply(split, wrapper)
    

    给了

    > lapply(split, wrapper)
    [[1]]
    [1] "50"
    
    [[2]]
    [1] " 30 "
    
    [[3]]
    [1] "1 "
    
    [[4]]
    [1] NA
    

    或许

    lens <- lengths(split)
    out <- lapply(split, `[`, 2L)
    ind <- lens == 1L
    out[ind] <- lapply(split[ind], `[`, 1L)
    out
    

    但这会循环来自strsplit() 的输出两次。

    【讨论】:

      猜你喜欢
      • 2013-10-07
      • 1970-01-01
      • 2016-10-15
      • 2019-08-11
      • 2012-10-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-06-29
      相关资源
      最近更新 更多