如何访问复杂列表中的元素?

Mar*_*tin 5 r

我有一个很好的列表,看起来像这样:

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循环有更好的想法吗?

Foj*_*sek 5

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)

  • 此data.frame不是正确的data.frame.每列都是一个列表.如果你执行`x <-do.call(rbind,lapply(tmp,unlist))`然后`dat <-data.frame(x,stringsAsFactors = FALSE,row.names = NULL)`就可以了. (2认同)

Joh*_*ohn 2

如果您绝对坚持必须在列表中执行此操作,则以下内容将适用于当前情况。

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)

这适用于列表长度与当前情况不同的情况。(我仍然认为您应该使用数据帧来提高数据的速度和合理的表示)。