用非唯一复制变量重构数据



我搜索了又搜索,但我确定这不是一个难题,我就是怎么也想不出来。

我有一个非常大的QPCR数据框架,输出类似于下面的例子,除了更多的患者和更多的检测器基因。我需要转换成宽格式,以便患者1 (P1)在同一行中有相应的检测器和ct值。

Sample  Detector  Ct 
P1      18s       9.428771 
P1      18s       9.369728
P1      18s       9.456004
P1      b2m       12.792814
P1      b2m       12.580547
P1      b2m       13.162326
P2      18s       19.428771 
P2      18s       19.369728
P2      18s       19.456004
P2      b2m       20.792814
P2      b2m       20.580547
P2      b2m       20.162326

我只能使用以下命令强制转换第一个复制:

reshape(data, direction = "wide", idvar='Sample', timevar='Detector')

但是不能强制转换复制值,因为它们的名称与第一个相同。

我已经尝试过make.names,但无法让它根据检测器和样本的值唯一地命名检测器。

任何帮助都将感激不尽。

编辑:

Martin问我希望数据是什么样子的,下面是一个例子。我已经重命名了我的基因的列名,因为我知道这是R如何需要他们是为了处理数据。谢谢Martin帮我整理格式

Sample  X18s       X18s.1     X18S.2     b2m        b2m.1      b2m.2
P1      9.428771   9.369728   9.456004   12.792814  12.580547  13.162326      
P2      19.428771  19.369728  19.456004  20.792814  20.580547  20.162326

也许这有帮助:

 data$indx <-with(data, ave(Sample, Detector, Sample, FUN=seq_along))
 reshape(data, direction="wide", idvar=c("Sample","indx"), timevar="Detector")[,-2]
 #  Sample    Ct.18s   Ct.b2m
 #1     P1  9.428771 12.79281
 #2     P1  9.369728 12.58055
 #3     P1  9.456004 13.16233
 #7     P2 19.428771 20.79281
 #8     P2 19.369728 20.58055
 #9     P2 19.456004 20.16233

更新

你可以试试:

    library(reshape2)
    dcast(data, Sample~Detector+indx, value.var="Ct")
    Sample     18s_1     18s_2     18s_3    b2m_1    b2m_2    b2m_3
 #1     P1  9.428771  9.369728  9.456004 12.79281 12.58055 13.16233
 #2     P2 19.428771 19.369728 19.456004 20.79281 20.58055 20.16233

另一个选项是使用dplyr

  library(dplyr)
  library(tidyr)
  data%>%
  unite(Det,Detector, indx,sep=".")%>%
  spread(Det,Ct)
  #  Sample     18s.1     18s.2     18s.3    b2m.1    b2m.2    b2m.3
  #1     P1  9.428771  9.369728  9.456004 12.79281 12.58055 13.16233
  #2     P2 19.428771 19.369728 19.456004 20.79281 20.58055 20.16233

更新

我在读取数据时使用stringsAsFactors=F,以便字符列不会被强制因子。如果我使用stringsAsFactors=T或默认值,则:

    data$indx <-with(data, ave(Sample, Detector, Sample, FUN=seq_along))
    #Warning messages:
   #1: In `[<-.factor`(`*tmp*`, i, value = 1:3) :
    invalid factor level, NA generated

将以上步骤替换为:

    data$indx <-with(data, ave(seq_along(Sample), Detector, Sample, FUN=seq_along))
    dcast(data, Sample~Detector+indx, value.var="Ct")
   #  Sample     18s_1     18s_2     18s_3    b2m_1    b2m_2    b2m_3
   #1     P1  9.428771  9.369728  9.456004 12.79281 12.58055 13.16233
   #2     P2 19.428771 19.369728 19.456004 20.79281 20.58055 20.16233

相关内容

  • 没有找到相关文章

最新更新