使用列表从更大的数据框创建新数据帧

时间:2011-10-05 18:45:21

标签: r dataframe

我有一个数据框,包含大量样本的多个数据点。这是一个缩短的例子,包含3个样本,每个样本有3个数据点:

Assay       Genotype      Sample 
CCT6-002        G         sam1   
CCT6-007        G         sam1
CCT6-013        C         sam1 
CCT6-002        T         sam2   
CCT6-007        A         sam2
CCT6-013        T         sam2 
CCT6-002        T         sam3   
CCT6-007        A         sam3
CCT6-013        T         sam3 

要进行下游分析,我想将每个样本的数据子集化为单个数据框。由于这是我将使用更改样本名称的许多数据集所做的事情,Id喜欢找出这样做的自动方式,因此我不需要每次都使用新样本列表编辑我的脚本。

我希望我的输出是每个样本的数据框,其名称与样本相同。因此,使用上面的示例数据,结果应该是3个数据帧,名称为sam1,sam2,sam3。每个数据框将有3行含有测定和基因型数据。

我很抱歉,如果这是一个非常基本的问题,但我是一个新手并且已经在这方面工作了很长一段时间。谢谢!

1 个答案:

答案 0 :(得分:3)

split命令是将其转换为样本上拆分的data.frame对象列表的最简单方法。

myList <- split(mydf, mydf$Sample)

可以通过数字索引(即myList[[1]])或变量Sample中唯一项目的名称(即myList$sam1)在列表中访问这些项目。

当您浏览序列时,数字索引显然非常方便,但您仍然可以使用该名称。

 #get names of the unique items in sample
 nam <- unique(mydf$Sample)
 #as a test look at the first few rows of each of my data.frames
 for( i in nam) print( head(myList[[i]]) )
 #another way to use access to the data.frame is the with() statement
 for( i in nam) with(myList[[i]], print( Assay[1:2] )

这不一定是效率最高的R语法,但希望它能让你在实际使用data.frame对象列表时更进一步。

现在,这可以为您提供所要求的内容,但这里有一些关于您要求的建议。不要这样做。只需学习如何正确地处理data.frame对象。你可以很容易地不列出列表并在代码中浏览Sample的所有独特实例...包括将它们保存为单独的文件。这样做的好处是你可以在完整的data.frame上做很多漂亮的矢量化命令,这些命令在列表上更加困难。只需坚持使用漂亮的大数据框架。

以下是一些简单的例子。看看我上面做了什么,只是获取列表中每个独立的data.frame对象的前几行。这里有类似的东西,只需在大数据框架上运行。

lapply( unique(mydf$Sample), function(x) print(head( mydf[ mydf$Sample == x,] )) )

更有意义的事情怎么样?假设我想要一个由Sample分隔的每个基因型的计数。

table( mydf$Genotype, mydf$Sample)

这比你对大名单所做的要容易得多。有很多功能,比如你要对你的完整数据框起诉,如tapplyaggregate。即使你想要做一些看起来像data.frame分解可能更容易的事情,比如在每个样本级别内进行排序,使用data.frame也会更容易。

mydf[ order(mydf$Sample, mydf$Assay), ]

按样品排序,然后按样品中的Assay排序。

当我开始使用R时,我认为拆分data.frame对象是最常用的方法。因为我更好地学习了R,所以我从来没有这样做过。在R用了几个星期后,我没有写过一个R代码,它将data.frame分成一个列表。我不是说你永远不应该这样做。我只是说你需要它或者它是最好的主意是相对罕见的。您可能希望在此处发布有关最终目标的查询,并就此提出一些建议。