【问题标题】:reshaping data with non unique replicate variables使用非唯一复制变量重塑数据
【发布时间】:2014-08-05 15:17:51
【问题描述】:

我一直在搜索和搜索,但我被困在我确信这不是一个困难的问题上,我只是一辈子都想不通。

我有一个非常大的 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,但无法让它根据 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

【问题讨论】:

  • 您希望输出是什么样的?我无法从数据中看出,因为我遇到了与 R 相同的问题,如何处理同一个检测器的多个观察结果?
  • 一个非常好的问题!我在底部编辑了我的主要帖子以提供帮助。
  • @詹姆斯。 I. 我更新了命令。请检查是否有帮助。
  • 已经完成了,谢谢。在我的 306 名患者身上也可以完美放大 34 个基因结果列表!

标签: r reshape reshape2


【解决方案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

【讨论】:

  • 感谢 akrun,我很抱歉在我的第一个问题中没有更清楚。我已经放置了一张表格,说明我希望数据如何处理现在的问题。我认为关键是在尝试重塑之前将我的 Detector 值重命名为detector,detector.1,detector.2,但我也无法弄清楚。
  • 感谢 Akrun,这正是我想看到的。恐怕我对命令 with,ave,seq_along 的掌握不足以处理我在数据上使用您的代码时遇到的错误。我收到“超过 50 个警告”,这些警告都与 In [&lt;-.factor(*tmp*, i, value = 1:3) 一致:无效因子水平,NA 生成”
  • @James I. 你能否展示一个示例数据集(最好使用 dput(head(data, 20)) 来显示你提到的错误。另外,尝试使用 with(data, ave(1:nrow(data), Detector, Sample, FUN=seq_along)) 代替第一个命令。我假设你得到这一步出错了。我用样本作为字符列
  • 阿克伦你成功了!最终解决方案完美无缺。非常感谢!我有一个非常复杂的循环来执行这个函数,并且知道 reshape2 有可能减少代码,并且在不知不觉中混合我的数据的机会更少。我只是无法解决拼图排序难题。再次感谢您!
猜你喜欢
  • 1970-01-01
  • 2016-12-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-10-02
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多