【问题标题】:Can't access items after an lapply应用后无法访问项目
【发布时间】:2012-01-26 18:31:59
【问题描述】:

我正在使用lapply 尝试拆分数据框中的字符串。这些字符串看起来都类似于"02D_48M_RHD"。我正在尝试获取“D”之前和“M”之前的数字。

我对@9​​87654325@ 的使用似乎有效:

a <- lapply(res$description, strsplit, split="[DM]_", fixed=FALSE)

> a[[1]]
[[1]]
[1] "02"  "48"  "RHD"

但是,在我的一生中,我无法弄清楚如何仅访问 a[1] 中向量的第一个元素。 documentation 建议 a[[1]][1] 应该给我第一个元素,但这就是发生的事情:

> a[[1]][1]
[[1]]
[1] "02"  "48"  "RHD"

我不明白为什么这不起作用。 R 告诉我这是一个向量,但它也说它的长度为 1。

> is.vector(a[[1]])
[1] TRUE
> length(a[[1]])
[1] 1

我不确定我误解了什么。 lapply 是否以不同于我预期的方式提供输出?我期望一个长度为三的向量列表,这就是它的样子。或者,这是我得到的,但我试图错误地访问它们?

最后,我想在我的数据框中添加三列,每条信息各一列,所以任何可以帮助我朝着这个方向前进的东西都将不胜感激。

【问题讨论】:

    标签: r lapply


    【解决方案1】:

    strsplit 已经矢量化,因此无需将其包装在 lapply 中。你很困惑,因为a 是向量列表,而不是向量列表。 IE。 a[[1]] 本身是一个包含向量的单元素列表。

    此外,列表是“向量”。这就是is.vector 返回TRUE 的原因。 is.character 应该返回 FALSE

    你想要这样的东西:

    splits    <- strsplit(res$description, "[DM]_", fixed=FALSE)
    res$one   <- sapply(splits, "[", 1)
    res$two   <- sapply(splits, "[", 2)
    res$three <- sapply(splits, "[", 3)
    

    【讨论】:

      【解决方案2】:

      我不认为你调用 lapply 是必要的,因为 strsplit 已经在向量上工作。这样的事情可能会有所帮助:

      a <- "02D_48M_RHD"
      #Create a vector of values to splot
      aa <- c(a,a,a,a,a,a,a)
      #rbind them together and make a data.frame
      > data.frame(do.call("rbind", strsplit(aa, split="[DM]_", fixed=FALSE)))
      
        X1 X2  X3
      1 02 48 RHD
      2 02 48 RHD
      3 02 48 RHD
      4 02 48 RHD
      5 02 48 RHD
      6 02 48 RHD
      7 02 48 RHD
      

      【讨论】:

        【解决方案3】:
         x=c('02D_48M_RHD', '34D_98M_AHR')
        
        
        > lapply(x,strsplit,split='[DM]_',fixed=F)
        [[1]]
        [[1]][[1]]
        [1] "02"  "48"  "RHD"
        
        
        [[2]]
        [[2]][[1]]
        [1] "34"  "98"  "AHR"
        

        这会产生令人讨厌的嵌套列表。我想你想要的是:

        > lapply(strsplit(x,split='[DM]_',fixed=F),'[',1)
        [[1]]
        [1] "02"
        
        [[2]]
        [1] "34"
        

        【讨论】:

        • 这很有帮助,但我很好奇为什么我无法找到最终得到的列表中的内部项目。
        • 它是一个包含字符串的列表列表。看看str(a)。 a[[1]][[1]][1] 会得到它。你也可以看看class(a)class(a[[1]])class(a[[1]][[1]])
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-06-21
        • 1970-01-01
        • 2013-10-27
        • 2015-02-08
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多