使用非唯一复制变量重塑数据

时间:2014-08-05 15:17:52

标签: r reshape reshape2

我已经搜索过并搜索过,但我仍然坚持认为我不确定的问题,我无法解决这个问题。

我有一个非常大的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')

但是不能转换重复值,因为它们与第1个名称相同。

我已经尝试了make.names,但无法根据Detector和Sample的值来识别Detector。

感谢任何帮助。

编辑:

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

1 个答案:

答案 0 :(得分:1)

可能有帮助:

 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