从两列中提取值

时间:2012-12-04 01:38:37

标签: r

我有以下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...

2 个答案:

答案 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") ]