我有一个列表
ls<-list(c("a"="one","b"="two"),"x"="t4",c("y"="t5","z"="t6"))
我想通过名称而不是索引来提取列表元素。有办法吗?
与
ls["a"]
> "one"
ls["y"]
> "t5"
我只需要输出“一个”和“ t5”。我将使用这些输出将其与其他字符串解析,或者对其他变量进行算术运算(如果输出为数字)
我发现了一个类似的问题,R: get element by name from a nested list。 但这不起作用。有什么想法吗?
答案 0 :(得分:2)
使用plyr
:
plyr::llply(lst,function(x) x["a"])
或:
Filter(Negate(is.na),plyr::llply(lst,function(x) x["y"]))
[[1]]
y
"t5"
您可以通过使其具有功能来使其自动化。
尝试使过程自动化(可能很慢):
purrr::map(c("a","y"),
function(x) lapply(lst, function(z) z[x]))
答案 1 :(得分:1)
鉴于组件名称是唯一的,以下在您的特定情况下可能就足够了(否则存在可识别性问题)。
## data
ls <- list(c(a = "one", b = "two"), x = "t4", list(c(y = "t5", z = "t6")))
getElement <- function(ls, name) unlist(ls)[[grep(name, names(unlist(ls)))]]
getElement(ls, "a")
#> [1] "one"
getElement(ls, "b")
#> [1] "two"
getElement(ls, "x")
#> [1] "t4"
getElement(ls, "y")
#> [1] "t5"
答案 2 :(得分:1)
我们只需unlist
列表并使用[[
运算符,该运算符将返回未命名的单元素向量:
unlist(ls)[["a"]]
# [1] "one"
unlist(ls)[["y"]]
# [1] "t5"
如果要保留名称,请使用[
:
unlist(ls2)["a"]
# a
# "one"
unlist(ls2)["y"]
# y
# "t5"