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并没有取得任何进展。

4

3 回答 3

6

使用split

split(refchem, list(refchem$target, refchem$mechanism))

应该做的伎俩。

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

于 2013-09-20T18:35:08.677 回答
4

如果您改为创建一个键控 data.table,...

  • 您仍然会将所有数据放在一个 data.frame 中(而不是可能嵌套的许多列表);
  • 您可能会发现迭代这些子集更好;和
  • 语法很干净:

要访问子集:

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

为每个组做一些事情,这将rbind在结果中一起编辑:

DT[,{do stuff},by=key(DT)]

与 类似aggregate(),任何正确长度的向量列表都可以进入by,而不仅仅是键。

最后,DT来自...

 require(data.table)
 DT <- data.table(refchem,key=c('target','mechanism'))
于 2013-09-20T18:50:17.487 回答
3

您还可以使用一个plyr函数:

library(plyr)
dlply(example, .(target, mechan))

如果需要,它具有使用函数处理数据的额外优势(identity上面有一个隐含的)。

于 2013-09-20T18:46:45.467 回答