Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/70.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
R 使用非唯一复制变量重塑数据_R_Reshape_Reshape2 - Fatal编程技术网

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

R 使用非唯一复制变量重塑数据,r,reshape,reshape2,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

我找了又找,但我确定这不是一个难题,我就是一辈子都想不出来

我有一个非常大的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帮我整理好格式

这可能有帮助:

 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
其他选项是使用
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
,这样字符列就不会被强制为factor。如果使用
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您希望输出是什么样的?我无法从数据中判断,因为我遇到了与R相同的问题,如何处理同一探测器的多个观测值?一个非常好的问题!“我编辑了我在底部的主要帖子以帮助你。”詹姆斯。我更新了命令。请检查是否有帮助。完成了,谢谢。在我的306名患者身上也能完美地放大34个基因的结果列表!谢谢akrun,很抱歉我的第一个问题没有说得更清楚。我已经在问题中放置了一个表格,列出了我希望数据在重塑后如何处理。我想关键是在我尝试重塑之前将我的探测器值重命名为Detector,Detector.1,Detector.2,但我也不明白。谢谢Akrun,这正是我想要看到的。恐怕我对with、ave、seq_以及
命令的掌握不足以处理我在数据上使用您的代码时遇到的错误。我收到的“超过50条警告”都是在
[@James I.你能展示一个示例数据集(最好使用
dput(head(data,20))
来显示你提到的错误。另外,尝试
使用(data,ave(1:nrow(data),Detector,Sample,FUN=seq_-along))
代替第一个命令。我假设您在这一步中出现错误。我使用sample作为字符列akrun,您已经搞定了!最终的解决方案完美无瑕。非常感谢!我有一个非常复杂的循环来执行此函数,并且知道整形2有可能减少代码,减少无意中混合的机会我的数据被收集起来了。我只是无法解决排序难题。再次感谢你!
  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
    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