如何重新排列数据框,以便一列中的值是行名?

时间:2017-08-18 13:33:24

标签: r dataframe bioinformatics transpose tidyverse

我的数据框包含大约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作为列名称。

谢谢!

3 个答案:

答案 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