如何访问R

时间:2017-03-07 20:57:38

标签: r

当我在数据框的一列上调用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

我知道我可以使用&#39; []&#39;来访问各个拆分列表。和&#39; [[]]&#39;告诉我这些子列表的内容,所以我想我明白了。并且我可以访问&#34; 30&#34;在[[2]]中通过分割[[2]] [2]。

不幸的是,我不知道如何以编程方式访问整个列。我正在尝试将列转换为数字数据。但那&#34; 1小时30&#34;案件给了我很多麻烦。

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中的列表和列表处理,所以感谢任何帮助。

1 个答案:

答案 0 :(得分:0)

一个常见的习语lapply(l, [, 2),适用于您的示例:

> lapply(split, `[`, 2)
[[1]]
[1] NA

[[2]]
[1] " 30 "

[[3]]
[1] NA

[[4]]
[1] NA
如果可以的话,

sapply()会将其折叠为矢量。

正在做的是lapply()依次获取split的每个组件 - 这是伪代码的[[i]]位 - 并且我们想要提取{ {1}}元素。我们将n函数与参数[一起应用 - 在本例中为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 的输出上循环两次。