组合具有相同值的列号

时间:2013-03-06 11:53:01

标签: r

我有以下格式的矩阵

[,1]   [,2]   [,3]   [,4]   [,5]   [,6]   [,7]   [,8]   [,9]  [,10]  [,11]
   1     1     3      2      3       1      1     2      3       3      2

以下是我想要的输出(组合列号,具有相同的值)。

a<-1,2,6,7
b<-3,5,9,10
c<-4,8,11

4 个答案:

答案 0 :(得分:5)

以下为您提供了足够的清单:

aList <- setNames(split(seq_along(mat), mat), unique(letters[mat]))
aList
#  $a
# [1] 1 2 6 7
#
# $c
# [1]  4  8 11
# 
# $b
# [1]  3  5  9 10

但是如果你真的需要环境中的变量,那么你可以这样做:

attach(aList)

答案 1 :(得分:1)

m1 <-  matrix(c(1, 1, 3, 2, 3, 1, 1, 2, 3, 3, 2), nrow = 1)
split(seq_len(ncol(m1)), m1[1, ])

为您提供包含所需元素的列表。我假设你真的不想创建向量abc

split(seq_len(ncol(m1)), m1[1, ])

$`1`
[1] 1 2 6 7

$`2`
[1]  4  8 11

$`3`
[1]  3  5  9 10

答案 2 :(得分:0)

你的问题有点奇怪,我怀疑你遗漏了一些细节。要得到你想要的东西有点笨重。首先生成一些数据:

##Some data
R> m = matrix(sample(1:3, 10, replace=T), ncol=10)
R> m
     [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9] [,10]
[1,]    1    2    2    3    1    3    3    2    2     1

然后选择唯一值:

R> v = unique(m[1,])

现在根据需要创建向量:

R> (a = which(v[1]==m[1,]))
[1]  1  5 10
R> (b = which(v[2]==m[1,]))
[1] 2 3 8 9
R> (c = which(v[3]==m[1,]))
[1] 4 6 7

然而这不可扩展(或优雅)。如果您有多个值,则需要迭代v,如下所示:

(l = sapply(v, function(i) which(m[1, ] == i)))

变量l是一个列表。要访问各个元素,请使用

l[[1]]
l[[2]]
l[[3]]

答案 3 :(得分:0)

您可以使用by按重复元素进行分组并返回其rownames。

tab <- read.table(text ='[,1]   [,2]   [,3]   [,4]   [,5]   [,6]   [,7]   [,8]   [,9]  [,10]  [,11]
   1     1     3      2      3       1      1     2      3       3      2',head=T)

x <- t(tab)
by(x,x,FUN=rownames)
INDICES: 1
[1] "X..1." "X..2." "X..6." "X..7."
---------------------------------------------------------------------------------------------------------- 
INDICES: 2
[1] "X..4."  "X..8."  "X..11."
---------------------------------------------------------------------------------------------------------- 
INDICES: 3
[1] "X..3."  "X..5."  "X..9."  "X..10."

编辑更漂亮的输出

rownames(x) <- 1:nrow(x)
> by(x,x,FUN=rownames)
INDICES: 1
[1] "1" "2" "6" "7"
---------------------------------------------------------------------------------------------------------- 
INDICES: 2
[1] "4"  "8"  "11"
---------------------------------------------------------------------------------------------------------- 
INDICES: 3
[1] "3"  "5"  "9"  "10"