我有一个数据帧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
答案 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)
rownames
和colnames
等功能也有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]]
方法。