我有一个很好的列表,看起来像这样:
tmp = NULL
t = NULL
tmp$resultitem$count = "1057230"
tmp$resultitem$status = "Ok"
tmp$resultitem$menu = "PubMed"
tmp$resultitem$dbname = "pubmed"
t$resultitem$count = "305215"
t$resultitem$status = "Ok"
t$resultitem$menu = "PMC"
t$resultitem$dbname = "pmc"
tmp = c(tmp, t)
t = NULL
t$resultitem$count = "1"
t$resultitem$status = "Ok"
t$resultitem$menu = "Journals"
t$resultitem$dbname = "journals"
tmp = c(tmp, t)
Run Code Online (Sandbox Code Playgroud)
哪个产生:
> str(tmp)
List of 3
$ resultitem:List of 4
..$ count : chr "1057230"
..$ status: chr "Ok"
..$ menu : chr "PubMed"
..$ dbname: chr "pubmed"
$ resultitem:List of 4
..$ count : chr "305215"
..$ status: chr "Ok"
..$ menu : chr "PMC"
..$ dbname: chr "pmc"
$ resultitem:List of 4
..$ count : chr "1"
..$ status: chr "Ok"
..$ menu : chr "Journals"
..$ dbname: chr "journals"
Run Code Online (Sandbox Code Playgroud)
现在我想搜索每个元素resultitem.我想知道dbname每个数据库的数量少于10 count(例子).在这种情况下它很容易,因为这个列表只有3个元素,但真正的列表有点长.
这可以简单地用for循环完成.但有没有办法用R的其他功能(如rapply)做到这一点?我对这些应用函数的问题是,它们只看一个元素.
如果我用grep来获取所有dbname元素,我就无法获得每个元素的计数.
rapply(tmp, function(x) paste("Content: ", x))[grep("dbname", names(rapply(tmp, c)))]Run Code Online (Sandbox Code Playgroud)
有人比for循环有更好的想法吗?
R通常希望将这些东西作为data.frames来处理,所以我认为你最好的办法就是把你的列表变成一个(或者甚至创建一个data.frame而不是一个列表开头,除非你需要它以列表形式).
x <- do.call(rbind,tmp)
dat <- data.frame(x)
dat$count <- as.numeric(dat$count)
> dat
count status menu dbname
1 1057230 Ok PubMed pubmed
2 305215 Ok PMC pmc
3 1 Ok Journals journals
Run Code Online (Sandbox Code Playgroud)
然后得到你的答案你可以使用正常的data.frame子集操作:
> dat$dbname[dat$count<10]
$resultitem
[1] "journals"
Run Code Online (Sandbox Code Playgroud)
如果您绝对坚持必须在列表中执行此操作,则以下内容将适用于当前情况。
x <- tmp[sapply(tmp, function(x){x$count>10})]
str(x)
(the list items you wanted)
Run Code Online (Sandbox Code Playgroud)
更一般地说,如果您想以这种方式实际使用不规则列表,您可以使用相同的代码,但首先检查该项目是否存在
testForCount <- function(x) {if ('count' %in% names(x)) x$count>10 else FALSE}
tmp[sapply (tmp, count)]
Run Code Online (Sandbox Code Playgroud)
这适用于列表长度与当前情况不同的情况。(我仍然认为您应该使用数据帧来提高数据的速度和合理的表示)。