R 将数据帧转换为列表

R 将数据帧转换为列表,r,list,dataframe,apply,R,List,Dataframe,Apply,我试图在R中从一个数据帧转换成一个列表结构(从技术上讲,我知道数据帧是一个列表)。我有一个数据框架,其中包含参考化学品及其机制和不同的目标。例如,雌激素是雌激素受体激动剂。我希望将数据框转换为列表,因为我已经厌倦了键入以下内容: refchem$chemical_id[refchem$target=="AR" & refchem$mechanism=="Agonist"] 每次我需要查看特定参考化学品的清单时。我更希望通过以下方式获取化学品: refchem$AR$Agonist 尽

我试图在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 ])
  }
}

示例使用
拆分

split(refchem, list(refchem$target, refchem$mechanism))
我们应该做到这一点


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

您也可以使用
plyr
功能:

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

如果需要,它还具有使用函数处理数据的附加优势(上面有一个隐式的
标识)。

如果您制作一个键控的data.table

  • 您仍然将所有数据放在一个data.frame中(而不是许多数据的嵌套列表)
  • 您可能会发现迭代这些子集更好;及
  • 语法非常清晰:
要访问子集,请执行以下操作:

DT[.('AR','Agonist')] 
要为每组做一些事情,结果中将
rbind
ed放在一起:

DT[,{do stuff},by=key(DT)]
aggregate()
类似,任何长度正确的向量列表都可以通过
进入
,而不仅仅是键

最后,
DT
来自

 require(data.table)
 DT <- data.table(refchem,key=c('target','mechanism'))
require(data.table)

谢谢!这就是我一直在寻找的。有没有一种方法可以删除没有任何条目的因子,而不必在
drop
参数中手动列出它们?因为
drop
是合乎逻辑的,您可以只设置
drop=TRUE
,而
R
应该为您做。我一直推迟学习data.table包。可能是时候了。@dayne我也这么做了很长一段时间——但我知道这是我用R做出的最好的决定。我曾经有一个函数,它有150行代码,运行了5分钟,现在运行15秒,占用了25行代码。