我试图从数据框转到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
并且没有取得任何进展。
答案 0 :(得分:6)
使用split
:
split(refchem, list(refchem$target, refchem$mechanism))
应该做的伎俩。
新的访问方式是refchem$AR.Agonist
答案 1 :(得分:4)
如果你改为使用键控data.table,那么......
访问子集:
DT[.('AR','Agonist')]
要为每个组执行某些操作,结果将rbind
组合在一起:
DT[,{do stuff},by=key(DT)]
与aggregate()
类似,任何正确长度的向量列表都可以进入by
,而不仅仅是密钥。
最后,DT
来自......
require(data.table)
DT <- data.table(refchem,key=c('target','mechanism'))
答案 2 :(得分:3)
您还可以使用plyr
功能:
library(plyr)
dlply(example, .(target, mechan))
如果需要,它还具有使用函数处理数据的额外优势(上面有隐式identity
)。