R List with sub-lists:将所有匹配规则的元素提取到数组中

cur*_*cat 3 r

我有一个 R 对象列表,它们也是各种类型的列表。我想要所有类别为“内部”的对象的“成本”值。实现这一目标的好方法是什么?

如果我有一个数据框,我会做类似的事情

my_dataframe$cost[my_dataframe$category == "internal"]
Run Code Online (Sandbox Code Playgroud)

列表的类似习语是什么?

mylist<-list(list(category="internal",cost=2),
list(category="bar",cost=3),list(category="internal",cost=4),
list(category='foo',age=56))
Run Code Online (Sandbox Code Playgroud)

在这里我想得到 c(2,4)。像这样子集不起作用:

mylist[mylist$category == "internal"]
Run Code Online (Sandbox Code Playgroud)

我可以通过以下方式完成部分工作:

temp<-sapply(mylist,FUN = function(x) x$category=="internal")
mylist[temp]
[[1]]
[[1]]$category
[1] "internal"

[[1]]$cost
[1] 2


[[2]]
[[2]]$category
[1] "internal"

[[2]]$cost
[1] 4
Run Code Online (Sandbox Code Playgroud)

但是我如何获得成本以便我可以(比如)总结它们等等?我试过这个,但没有多大帮助:

unlist(mylist[temp])
  category       cost   category       cost 
"internal"        "2" "internal"        "4" 
Run Code Online (Sandbox Code Playgroud)

是否有一个整洁、紧凑的习语来做我想做的事?

sha*_*yaa 6

你要找的成语是

sapply(mylist, "[[", "cost")
Run Code Online (Sandbox Code Playgroud)

它返回提取向量的列表,如果存在,则返回 NULL 如果不存在。

[[1]]
[1] 2

[[2]]
[1] 3

[[3]]
[1] 4

[[4]]
NULL
Run Code Online (Sandbox Code Playgroud)

如果您只想要内部类别的总和,则可以假设您想要一个向量,执行以下操作。

sum(sapply(mylist[temp], "[[", "cost"))
Run Code Online (Sandbox Code Playgroud)

如果你想要一个相同结果的列表,你可以做

sapply(mylist,function(x) x[x$category == "internal"]$cost)
Run Code Online (Sandbox Code Playgroud)

关于 R 的美丽但具有挑战性的事情之一是有很多方法可以表达相同的语言。

您可能会从其他答案中注意到您可以互换,sapply并且lapply由于列表只是异构向量,因此以下内容也将返回6.

do.call("sum",lapply(mylist, function(x) x[x[["category"]] == "internal"]$cost))
Run Code Online (Sandbox Code Playgroud)