繁体   English   中英

将数据框转换为列表

[英]Convert data frame to list

我试图从数据框转到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并没有取得任何进展。

使用split

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

应该做的伎俩。

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

如果你做一个键控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'))

您还可以使用plyr函数:

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM