我想构建一个对象列表并根据它们的一个属性提取对象。例如
persons_list <- list(PersonA = list(color = 'red', group = 1),
PersonsB = list(color = 'blue', group = 1),
PersonsC = list(color = 'green', group = 2))
现在我想将所有颜色提取为一个向量,其中group等于1,结果为:
c('red', 'blue')
我不确定列表是否可以到达此处,但我之所以选择它是因为我还希望能够通过键入
来使用列表的自动完成/浏览功能persons_list$PersonA
答案 0 :(得分:1)
我们可以做到
unlist(lapply(persons_list, function(x) x$color[x$group==1]), use.names = FALSE)
#[1] "red" "blue"
答案 1 :(得分:1)
不,这个数据结构对于您的用例来说并不是最理想的。使用data.frame:
persons <- data.frame(person = c("A", "B", "C"),
color = c("red", "blue", "green"),
group = c(1, 1, 2),
stringsAsFactors = FALSE)
persons[persons$group == 1, "color"]
#[1] "red" "blue"
表格结构不仅更自然,查找也更有效。
答案 2 :(得分:1)
Akrun总是更快。 : - )
更一般。您可以构建一些通用功能来完成这项工作而无需太多的认知努力。我还没有构建任何工具来从列表中选择东西。但我可以放弃
remove_if <- function(lst,test_fn) {
## DD . char or list
if (class(lst)=="character"){
unlist(lapply(lst ,function(x){if(!(test_fn(x))) x }))
} else {
remove_if_null(lapply(lst ,function(x){if(!(test_fn(x))) x }))}
}
删除第2组,然后选择所需的部分。
unlist(lapply(remove_if(persons_list, function(x) x$group==2),"[[",1))
## PersonA PersonsB
## "red" "blue"
答案 3 :(得分:0)
library(rlist)
有很多很好的列表功能,可以将一些整齐的动词用于列出操作。
library(rlist)
library(magrittr)
list.filter(persons_list, group == 1) %>%
list.select(color) %>%
unlist(use.names = F)
答案 4 :(得分:0)
我知道这是旧的,但我错过了更一般的答案。
我会使用:
unlist(lapply(persons_list[which(sapply(persons_list, function(person) { person$group==1 }))], function(x) x$color), use.name = FALSE)
或者为了更容易阅读,我可能会把它分成两行:
第一个过滤器:
persons_in_group_1 = persons_list[which(sapply(persons_list, function(person) { person$group==1 }))]
然后映射所需的属性:
unlist(lapply(persons_in_group_1, function(x) x$color ), use.names = FALSE)