将列表项更改为名称R.

时间:2015-05-08 14:54:26

标签: r list

我有很多看起来像这样的列表

: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”在不同的地方,所以手动更改是非常耗时的。

2 个答案:

答案 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
  • 在ColonelBeauvel中,删除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))