我有很多看起来像这样的列表
:List of 73
..$ :List of 2
.. ..$: chr "aaaa"
.. ..$: num 2
..$ :List of 2
.. ..$: chr "cccc"
.. ..$: num 7
..$ :List of 2
.. ..$: chr "dddd"
.. ..$: num 5
..$ :List of 2
.. ..$: chr "bbbb"
.. ..$: num 6
等等73次
因此列表中有73个列表。这些列表的每个部分都包含两个项目。但事实上它是一个项目,第二个项目是价值。如何以自动方式更改列表,使其看起来像这样:
:List of 73
$ aaaa: num 2
$ cccc: num 7
$ dddd: num 5
$ bbbb: num 6
等等73次
我有很多列表看起来像这样,但每次“aaaa”在不同的地方,所以手动更改是非常耗时的。
答案 0 :(得分:6)
对于x
的每个元素mylist
,您可以使用x[[1]]
访问第一个子列表;第二个是x[[2]]
。此函数也可以称为`[[`(x,i)
,其中i
是子列表的编号。
mylist <- list(list("aa",2),list("cc",7))
str(mylist)
# List of 2
# $ :List of 2
# ..$ : chr "aa"
# ..$ : num 2
# $ :List of 2
# ..$ : chr "cc"
# ..$ : num 7
mynewlist <- setNames(lapply(mylist,`[[`,2),sapply(mylist,`[[`,1))
str(mynewlist)
# List of 2
# $ aa: num 2
# $ cc: num 7
setNames(x,xnames)
只返回x
,其元素标有xnames
。
不使用列表。您可能不需要list
并且可以使用矢量,这更简单:
lapply
切换为sapply
。as.list
来电。按名称访问其元素非常直观:
myvec <- setNames(sapply(mylist,`[[`,2),sapply(mylist,`[[`,1))
myvec["aa"]
# aa
# 2
答案 1 :(得分:1)
我宁愿使用没有lapply
的方法。如果lst
是您的初始list
:
x = unlist(lst)
setNames(as.list(as.numeric(x[seq(2, length(x),2)])),x[seq(1, length(x),2)])
#$aaaa
#[1] 2
#$cccc
#[1] 7
数据:强>
lst=list(list('aaaa',2), list('cccc',7))