我有一个像下面这样的矩阵
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
答案 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))