【问题标题】:Convert data frame to list将数据框转换为列表
【发布时间】:2013-09-26 05:45:50
【问题描述】:

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

【问题讨论】:

    标签: r list dataframe apply


    【解决方案1】:

    使用split:

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

    应该做的伎俩。

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

    【讨论】:

    • 谢谢!这主要是我一直在寻找的。有没有办法删除没有任何条目的因子而不在 drop 参数中手动列出它们?
    • 既然drop 是合乎逻辑的,你可以设置drop=TRUER 应该为你做。
    【解决方案2】:

    您也可以使用plyr 函数:

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

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

    【讨论】:

      【解决方案3】:

      如果您改为使用键控 data.table,...

      • 您仍将所有数据保存在一个 data.frame 中(而不是一个可能嵌套的多个列表);
      • 您可能会发现对这些子集进行迭代会更好;和
      • 语法很简洁:

      访问子集:

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

      要为每个组做某事,结果将是rbinded:

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

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

      最后,DT 来自...

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

      【讨论】:

      • 我一直在推迟学习 data.table 包。应该是时候了。
      • @dayne 我也这样做了很长时间 - 但知道这是我用 R 做过的最好的决定。我曾经有一个 150 行代码的函数,现在运行它需要 5 分钟运行时间为 15 秒,占用 25 行代码。
      猜你喜欢
      • 2020-04-15
      • 2020-04-17
      • 2022-11-14
      • 2011-05-12
      相关资源
      最近更新 更多