当我在数据框的一列上调用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中的列表和列表处理,所以感谢任何帮助。
答案 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
的输出上循环两次。