R 使用列表从较大的数据帧创建新数据帧

R 使用列表从较大的数据帧创建新数据帧,r,dataframe,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

我有一个数据框,其中包含大量样本的多个数据点。下面是一个简短的示例,其中有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 
为了进行下游分析,我想将每个样本的数据子集到一个单独的数据框中。由于这是我将在更改样本名称的许多数据集上执行的操作,我想找出一种自动执行此操作的方法,这样我就不需要每次使用新样本列表编辑脚本

我希望我的输出是一个数据帧,每个样本的名称与样本相同。因此,对于上面的示例数据,结果应该是3个名为sam1、sam2、sam3的数据帧。每个数据框将有3行分析和基因型数据


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

split命令是将其转换为data.frame对象列表的最简单方法,该列表根据示例进行分割

myList <- split(mydf, mydf$Sample)
这不一定是最有效的R语法,但希望它能让您在实际使用data.frame对象列表时走得更远

现在,这给了你你想要的,但是这里有一些关于你想要什么的建议。不要这样做。只需学习如何正确访问data.frame对象。您也可以很容易地不列出清单,而查看代码中所有Sample的唯一实例。。。包括将它们保存为单独的文件。这样做的好处是,您可以在完整的data.frame示例上执行许多漂亮的矢量化命令,而这些命令在列表中要难得多。坚持你的观点,好的大数据

lapply( unique(mydf$Sample), function(x) print(head( mydf[ mydf$Sample == x,] )) )
mydf[ order(mydf$Sample, mydf$Assay), ]
这里有几个简单的例子。看看我在上面做了些什么,只得到了列表中每个单独data.frame对象的前几行。这里有一些类似的东西,只是在bigdata.frame上运行

lapply( unique(mydf$Sample), function(x) print(head( mydf[ mydf$Sample == x,] )) )
mydf[ order(mydf$Sample, mydf$Assay), ]
来点更有意义的怎么样?假设我想要一个由样本分离的每个基因型的计数

table( mydf$Genotype, mydf$Sample)
这比你处理大名单要容易得多。在完整的数据上有很多类似的函数。框架类似于
tapply
aggregate
。即使您想做一些看起来更容易使用data.frame的事情,比如在每个样本级别内进行排序,使用data.frame也更容易

lapply( unique(mydf$Sample), function(x) print(head( mydf[ mydf$Sample == x,] )) )
mydf[ order(mydf$Sample, mydf$Assay), ]
这将按样本排序,然后按嵌套在样本中的分析排序


当我开始使用R时,我认为拆分data.frame对象是一种方法,并经常使用它。自从我学得更好以后,我从来没有这样做过。在使用R的几周之后,我还没有编写过一段将data.frame拆分为列表的R代码。我不是说你不应该这样做。我只是说,你需要它或它是最好的主意,这是相对罕见的。你可能想在这里发布一个关于你最终目标的查询,并获得一些建议。

谢谢John。但这会将拆分列表保存到一个大数据框中(在您的示例中,名称为myList)。理想情况下,我喜欢多个数据帧,每个样本一个。@SamGlobus John的回答确实会导致多个数据帧,每个样本一个。df只是包含在一个列表中(不像你想象的那样是一个数据帧)。好吧,我知道你可以使用唯一的名称访问它,但是由于每次我获取新数据时示例列表都会发生变化,我不确定如何使用这些唯一的名称编写下游代码。例如,如果我想使用:mylist$sam1[order(mylist$sam1$Assay)]对新列表进行排序,我必须为每个样本编写代码。谢谢@Joran,我仍然不知道这些东西中有多少是有效的。我为愚蠢的问题/评论道歉。@SamGlobus不使用
$
。通过
mylist['sam1'][,'Assay']
访问列。