我有以下df称为数据:
ProbeID SampleID ExperimID Value
1 2747406 1 2 6.44
1 2747406 4 2 5.90
etc....
我正在尝试提取与样本ID = 1(数据[,2] = 1)和样本ID = 4(数据[,2] = 4)相匹配的第4列(数据[,4])中的值)
值必须与SampleID匹配并一起提取(即对于SampleID 1,值= 6.44,对于SampleID 4,值= 5.90)。它们可以分成新的df(x和y),理想情况下给我x包含所有SampleID 1值,y包含所有SampleID 4值。 我完全坚持这一点,任何帮助都非常感谢。
目标是获得两个新的数据帧,如x和y,如下图所示:
x为:
SampleID Value
1 1 6.44
etc..
和y是:
SampleID Value
1 4 5.90
etc...
答案 0 :(得分:2)
这是split
dataBySample <- split(data, data$SampleID)
所以dataBySample
是一个列表,其中的元素包含与您所需输出相对应的data.frames
。
如果您真的想在全局环境中填充这些data.frames,那么您可以执行以下操作
newnames <- paste0('sample', names(dataBySample))
for(i in seq_along(dataBySample)){
assign(newnames[i], dataBySample[[i]])
}
# so now there are dataframes called sample1 and sample4
sample1
ProbeID SampleID ExperimID Value
1 2747406 1 2 6.44
sample4
ProbeID SampleID ExperimID Value
2 2747406 4 2 5.9
如果将这些data.frames保留在列表中并且不用它们污染全局环境,那么您对这些data.frames几乎所做的任何事情都会更容易控制。特别是,正如在您的评论中,它注意到您有2405670个样本。你真的想创建那么多data.frames吗?
答案 1 :(得分:1)
我认为你应该听听mnel,但是如果你真的想用不相交的数据混乱你的工作区,那就这样做:
res1 <- dfrm[ dfrm$sampleID == 1 , c("SampleID", "Value") ]
res4 <- dfrm[ dfrm$sampleID == 4 , c("SampleID", "Value") ]