我有一个数据框,包含大量样本的多个数据点。这是一个缩短的例子,包含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行含有测定和基因型数据。
我很抱歉,如果这是一个非常基本的问题,但我是一个新手并且已经在这方面工作了很长一段时间。谢谢!
答案 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)
这比你对大名单所做的要容易得多。有很多功能,比如你要对你的完整数据框起诉,如tapply
和aggregate
。即使你想要做一些看起来像data.frame分解可能更容易的事情,比如在每个样本级别内进行排序,使用data.frame也会更容易。
mydf[ order(mydf$Sample, mydf$Assay), ]
按样品排序,然后按样品中的Assay排序。
当我开始使用R时,我认为拆分data.frame对象是最常用的方法。因为我更好地学习了R,所以我从来没有这样做过。在R用了几个星期后,我没有写过一个R代码,它将data.frame分成一个列表。我不是说你永远不应该这样做。我只是说你需要它或者它是最好的主意是相对罕见的。您可能希望在此处发布有关最终目标的查询,并就此提出一些建议。