将数据帧转换为矩阵并添加id

时间:2017-12-25 01:53:43

标签: r

我有一个数据帧df1,例如下面的

ID  SNP1    SNP2    SNP3    SNP4    SNP5
ID1   1       2      2       0       0
ID2   0       1      0       1       0
ID3   1       2      2       1       1
ID4   0       1      1       0       0
ID5   2       0      2       1       2

我想将其转换为下面的矩阵示例,并添加id和snps,因此我可以将其与我的另一个co-variate文件进行匹配以进行进一步分析

      ID1  ID2 ID3 ID4 ID5
SNP1    1   0   1   0   2
SNP2    2   1   2   1   0
SNP3    2   0   2   1   2
SNP4    0   1   1   0   1
SNP5    0   0   1   0   2

2 个答案:

答案 0 :(得分:2)

ID列移至rownames,然后将其删除,将数据框转换为矩阵并转置:

df1 <- data.frame(ID = c("ID1", "ID2", "ID3", "ID4", "ID5"), 
                  SNP1 = c(1L, 0L, 1L, 0L, 2L), 
                  SNP2 = c(2L, 1L, 2L, 1L, 0L), 
                  SNP3 = c(2L, 0L, 2L, 1L, 2L), 
                  SNP4 = c(0L, 1L, 1L, 0L, 1L), 
                  SNP5 = c(0L, 0L, 1L, 0L, 2L),
                  stringsAsFactors = FALSE)

rownames(df1) <- df1$ID
df1$ID <- NULL
mat1 <- t(as.matrix(df1))

mat1
#>      ID1 ID2 ID3 ID4 ID5
#> SNP1   1   0   1   0   2
#> SNP2   2   1   2   1   0
#> SNP3   2   0   2   1   2
#> SNP4   0   1   1   0   1
#> SNP5   0   0   1   0   2

tibble::column_to_rownames

library(tidyverse)

df1 <- data_frame(ID = c("ID1", "ID2", "ID3", "ID4", "ID5"), 
                  SNP1 = c(1L, 0L, 1L, 0L, 2L), 
                  SNP2 = c(2L, 1L, 2L, 1L, 0L), 
                  SNP3 = c(2L, 0L, 2L, 1L, 2L), 
                  SNP4 = c(0L, 1L, 1L, 0L, 1L), 
                  SNP5 = c(0L, 0L, 1L, 0L, 2L))

mat1 <- df1 %>% column_to_rownames('ID') %>% as.matrix() %>% t()

mat1
#>      ID1 ID2 ID3 ID4 ID5
#> SNP1   1   0   1   0   2
#> SNP2   2   1   2   1   0
#> SNP3   2   0   2   1   2
#> SNP4   0   1   1   0   1
#> SNP5   0   0   1   0   2

t()无论如何都会强制使用矩阵,但明确强制是一种好习惯。

答案 1 :(得分:2)

rownamescolnames等功能也有rownames<-colnames<-变种,可以像这样使用:

`colnames<-`(data, the_column_names)

因此,你可以通过以下方式直接做到这一点:

  • 删除t()
  • 的第一行
  • 添加新列名称

示例(使用@ alistaire的示例数据):

`colnames<-`(t(df1[-1]), df1[[1]])
##      ID1 ID2 ID3 ID4 ID5
## SNP1   1   0   1   0   2
## SNP2   2   1   2   1   0
## SNP3   2   0   2   1   2
## SNP4   0   1   1   0   1
## SNP5   0   0   1   0   2

请注意,您需要使用反引号(`)或引号("')才能使这些功能正常工作。

此外,这显然不会更改您的数据,因此您需要将其分配给新对象:

mat1 <- `colnames<-`(data, the_column_names)

其他几点说明:

  • 我们删除了第一列,因为它是一个需要成为列名的字符向量。如果保留它,它会将整个矩阵转换为字符矩阵。
  • 我们使用[[1]]来获取第一列的值。如果您刚刚使用df[1],则会返回list,但不能将其指定为列名。
  • 与上述相关,通过一致地使用[row, col]索引(例如:'colnames<-'(t(df1[, -1]), df1[, 1])来考虑它可能更容易。但是,data.frame的某些“重新实现” - 就像结构(例如:tbl s)不会在单列提取上删除维度。因此,如果您使用的是tbl而不是data.frame,则需要使用[[1]]方法。