我搜索了又搜索,但我确定这不是一个难题,我就是怎么也想不出来。
我有一个非常大的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