如何从R中的统一列表中提取值?

c00*_*ter 10 r extract list

例如,如何在people下面的列表中获取每个人年龄的向量:

> people = vector("list", 5)
> people[[1]] = c(name="Paul", age=23)
> people[[2]] = c(name="Peter", age=35)
> people[[3]] = c(name="Sam", age=20)
> people[[4]] = c(name="Lyle", age=31)
> people[[5]] = c(name="Fred", age=26)
> ages = ???
> ages
[1] 23 35 20 31 26
Run Code Online (Sandbox Code Playgroud)

是否有相当于Python列表的理解或具有相同效果的东西?

tfl*_*tre 18

你可以使用sapply:

> sapply(people, function(x){as.numeric(x[2])})
[1] 23 35 20 31 26
Run Code Online (Sandbox Code Playgroud)


Cha*_*ase 7

鉴于您提供的数据结构,我会使用sapply:

sapply(people, function(x) x[2])

> sapply(people, function(x) x[2])
 age  age  age  age  age 
"23" "35" "20" "31" "26" 
Run Code Online (Sandbox Code Playgroud)

但是,您会注意到这些结果是字符数据.

> class(people[[1]])
[1] "character"
Run Code Online (Sandbox Code Playgroud)

一种方法是强制要求as.numeric()as.integer()在对蓝绿色的呼吁中.

或者 - 如果您首先可以灵活地存储数据,那么将它存储为data.frames 列表可能是有意义的:

people = vector("list", 5)
people[[1]] = data.frame(name="Paul", age=23)
people[[2]] = data.frame(name="Peter", age=35)
...
Run Code Online (Sandbox Code Playgroud)

如果你要走得那么远,你可能还想考虑所有数据的单个data.frame:

people2 <- data.frame(name = c("Paul", "Peter", "Sam", "Lyle", "Fred")
                      , age = c(23,35,20,31, 26))
Run Code Online (Sandbox Code Playgroud)

可能还有其他一些原因导致您第一次没有考虑这种方法...

  • +1对于R-ish而不是Pythonic的数据结构的建议.另外,仅仅因为我认为它很漂亮:"sapply(人们,"[",2)`. (7认同)