独立排序矩阵及其对应的名称

时间:2015-02-20 17:28:39

标签: r

我有一个像下面这样的矩阵

Name       A           B        C          D       F
117_at   -0.0448    -0.136   -0.2189    0.0637   0.2498
121_at   -0.081      0.1412   0.0464    -0.018  -0.0408
1255_    0.0486     -0.0239   0.0753    -0.067   0.1304
1294_at  -0.109     -0.1266  -0.3023    0.0101   0.0594
1316_at  -0.0389    0.0915   -0.1352    0.1189   0.3161
1320_at  0.0147    -0.0064    0.009     -0.0411 -0.0497
1405_i      0       0.2178   -0.3024    0.2265  -0.0673
1431_at  0.0318     0.0556   -0.0434    -0.018   0.001
1438_at  0.0635     0.2065   -0.2112     0.0856  0.011
1487_at  0.071     -0.1315   0.0263      0.0198  0.0589

我想单独对每列进行排序,并将其保存在具有相应名称的单独文件中

如果我想分别根据每个列对矩阵进行排序,我可以按照这里的答案进行操作 Is there any way to sort columns of a matrix independently in R?

例如

name   A    B    C   
AA     1   -1    86
BB     20   0    -7
CC     30   6    98
DD     5    803  8

我希望在单独的文件中包含以下内容或每个内容 例如名称和A保存在1,名称和B保存在2等

name      A      name    B    name    C
    CC     30     DD     803    CC    98
    BB     20     CC     6      AA    86
    DD     5      BB     0      DD    8
    AA     1      AA     -1     BB    -7

2 个答案:

答案 0 :(得分:2)

您可以使用lapply生成已排序列的列表,这样可以方便后续保存单个列:

> z <- lapply(seq(2,ncol(d)), function(i) d[order(d[,i],decreasing = T),c(1,i)])
> z
[[1]]
  name  A
3   CC 30
2   BB 20
4   DD  5
1   AA  1

[[2]]
  name   B
4   DD 803
3   CC   6
2   BB   0
1   AA  -1

[[3]]
  name  C
3   CC 98
1   AA 86
4   DD  8
2   BB -7

如果你想把它们重新组合在一起:

> do.call(cbind,z)
  name  A name   B name  C
3   CC 30   DD 803   CC 98
2   BB 20   CC   6   AA 86
4   DD  5   BB   0   DD  8
1   AA  1   AA  -1   BB -7

d是您的样本数据集,即:

d <- structure(list(name = structure(1:4, .Label = c("AA", "BB", "CC", "DD"), class = "factor"), A = c(1L, 20L, 30L, 5L), B = c(-1L, 0L, 6L, 803L), C = c(86L, -7L, 98L, 8L)), .Names = c("name", "A", "B", "C"), class = "data.frame", row.names = c(NA, -4L))

答案 1 :(得分:1)

你可以尝试

 lst <- Map(function(x,y,z) setNames(data.frame(y,x)[order(-x),], 
             c('name', z)), df1[-1], list(df1[1]), names(df1)[-1])
 names(lst) <- NULL
 lst
 #[[1]]
 #  name  A
 #3   CC 30
 #2   BB 20
 #4   DD  5
 #1   AA  1

#[[2]]
#  name   B
#4   DD 803
#3   CC   6
#2   BB   0
#1   AA  -1

#[[3]]
#  name  C
#3   CC 98
#1   AA 86
#4   DD  8
#2   BB -7

 res <- do.call(cbind,lst)
 row.names(res) <- NULL
 res
 #  name  A name   B name  C
 #1   CC 30   DD 803   CC 98
 #2   BB 20   CC   6   AA 86
 #3   DD  5   BB   0   DD  8
 #4   AA  1   AA  -1   BB -7

更新

基于链接中提供的数据

 url <- 'https://gist.githubusercontent.com/anonymous/052e50e7e777849449b3/raw/data_example.txt'
 library(RCurl)
 x <- getURL(url, ssl.verifypeer=FALSE)

 df1 <- read.delim(textConnection(x),header=TRUE, row.names=1, 
            stringsAsFactors=FALSE)
 dim(df1)
 #[1] 507 990

 lst <- Map(function(x,y,z) setNames(data.frame(y,x)[order(-x),], 
            c('name', z)), df1, list(rownames(df1)), names(df1))

 length(lst)
#[1] 990

 lst[[1]][1:3,]
 #          name levopropoxyphene.HL60.665.5500024030760072207033.A11
 #393   200865_at                                               0.5001
 #323   200795_at                                               0.3676
 #49  200028_s_at                                               0.2452

数据

 df1 <- structure(list(name = c("AA", "BB", "CC", "DD"), 
 A = c(1L, 20L, 
 30L, 5L), B = c(-1L, 0L, 6L, 803L), C = c(86L, -7L, 98L, 8L)),
 .Names = c("name", 
 "A", "B", "C"), class = "data.frame", row.names = c(NA, -4L))