我有一个 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)
是否有一个整洁、紧凑的习语来做我想做的事?
你要找的成语是
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)