将数据框转换为列表

4

我希望将R中的数据框转换为列表结构(虽然技术上数据框本身也是一个列表)。我有一个包含参考化合物及其作用于不同目标机制的数据框。例如,雌激素是一种雌激素受体激动剂。我想将数据框转换为列表,因为我已经厌倦了手动输入类似以下内容:

refchem$chemical_id[refchem$target=="AR" & refchem$mechanism=="Agonist"]

每次我需要访问特定参考化学品列表时,我更愿意按以下方式访问化学品:

refchem$AR$Agonist

我希望你能给出一个通用的答案,虽然我提供了一个简单的例子,但并不是所有目标都有所有机制。

使用循环非常容易实现:

example <- data.frame(target=rep(c("t1","t2","t3"),each=20),
                      mechan=rep(c("m1","m2"),each=10,3),
                      chems=paste0("chem",1:60))
oneoption <- list()
for(target in unique(example$target)){
  oneoption[[target]] <- list()
  for(mech in unique(example$mechan)){
    oneoption[[target]][[mech]] <- as.character(example$chems[ example$target==target & example$mechan==mech ])
  }
}

我在想是否有更聪明的方法来实现它。我尝试使用 lapply 进行尝试,但没有取得任何进展。
3个回答

6
使用split函数:
split(refchem, list(refchem$target, refchem$mechanism))

应该可以解决问题。

新的访问方式为refchem$AR.Agonist


谢谢!这基本上是我在寻找的。有没有办法在不手动列出它们的情况下删除没有任何条目的因子? - dayne
由于drop是逻辑值,您只需设置drop=TRUE,然后R就会为您执行。 - Señor O

4
如果您使用键控数据表,...
  • 您仍将拥有所有数据的一个数据框(而不是可能嵌套的许多列表);
  • 您可能会发现在这些子集上进行迭代更加方便;并且
  • 语法非常简洁:

要访问子集:

DT[.('AR','Agonist')] 

为每个组做一些事情,这些组将在结果中rbind在一起:
DT[,{do stuff},by=key(DT)]

aggregate()类似,任何正确长度的向量列表都可以放入by中,而不仅仅是关键字。
最后,DT来自...
 require(data.table)
 DT <- data.table(refchem,key=c('target','mechanism'))

5
我一直在推迟学习data.table包的事情。现在可能是时候了。 - dayne
1
@dayne 我也曾经这样做了很长一段时间,但学习它是我在 R 中做出的最好决定。我曾经有一个函数,代码有 150 行,需要运行 5 分钟,现在只需要 15 秒就能运行,并且只占用了 25 行。 - Señor O

3
您可以使用 plyr 函数:
library(plyr)
dlply(example, .(target, mechan))

它有一个额外的优势,即使用函数来处理数据(上面隐含了identity)。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接