我的数据框包含大约450K甲基化β值。 450个探针用于两个样品。此数据显示在三列中,如下所示:
>head(ICGC)
submitted_sample_id probe_id methylation_value
1 X932-01-4D cg00000029 0.6
2 X932-01-6D cg00000029 0.4
3 X932-01-4D cg00000108 0.3
4 X932-01-6D cg00000108 0.7
5 X932-01-4D cg00000109 0.9
6 X932-01-6D cg00000109 0.1
我想重新排列这个data.frame,以便探测ID是rownames,样本ID是列名,所以它看起来像这样:
>head(ICGC_2)
X932-01-4D X932-01-6D
cg00000029 0.6 0.4
cg00000108 0.3 0.7
cg00000109 0.9 0.1
我试过了:
>library(tidyverse)
ICGC_2 <- ICGC %>% remove_rownames %>% column_to_rownames(var = "probe_id")
但这不起作用,因为ICGC中的每个探针ID在列中出现两次(因为有两个样本)。我也尝试过:
hello <- data.frame(ICGC[,-2], row.names = ICGC[,2])
但这也有同样的问题。我想以这种方式重新排列这些数据的原因是因为我想将beta值转换为M值并将此数据用作cpg.annotate中的对象(可通过Bioconductor包DMRcate获得) - cpg.annotate需要对象将唯一的Illumina探测ID作为rownames,将唯一的样本ID作为列名称。
谢谢!
答案 0 :(得分:3)
你非常接近。 spread
包中的tidyr
功能是您所需要的。
library(tidyverse)
ICGC_2 <- ICGC %>%
spread(submitted_sample_id, methylation_value) %>%
remove_rownames() %>%
column_to_rownames(var = "probe_id")
ICGC_2
X932-01-4D X932-01-6D
cg00000029 0.6 0.4
cg00000108 0.3 0.7
cg00000109 0.9 0.1
数据:
ICGC <- read.table(text = "submitted_sample_id probe_id methylation_value
1 'X932-01-4D' cg00000029 0.6
2 'X932-01-6D' cg00000029 0.4
3 'X932-01-4D' cg00000108 0.3
4 'X932-01-6D' cg00000108 0.7
5 'X932-01-4D' cg00000109 0.9
6 'X932-01-6D' cg00000109 0.1",
header = TRUE, stringsAsFactors = FALSE)
答案 1 :(得分:2)
在基地R你可以这样做:
wICGC <- reshape(ICGC, idvar = "probe_id",
timevar = "submitted_sample_id", direction = "wide")
wICGC <- data.frame(wICGC[,-1], row.names=wICGC[,1])
wICGC
# methylation_value.X932.01.4D methylation_value.X932.01.6D
# cg00000029 0.6 0.4
# cg00000108 0.3 0.7
# cg00000109 0.9 0.1
答案 2 :(得分:1)
对于不同的视角,您还可以在melt
中使用reshape
。
library(reshape)
m <- melt(IGC, id=c("submitted_sample_id", "probe_id"))
cast(m, probe_id~submitted_sample_id)
> cast(m, probe_id~submitted_sample_id)
probe_id X932-01-4D X932-01-6D
1 cg00000029 0.6 0.4
2 cg00000108 0.3 0.7
3 cg00000109 0.9 0.1