6

我有以下形式的矩阵

[,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

4 回答 4

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)
于 2013-03-06T12:03:09.520 回答
1
m1 <-  matrix(c(1, 1, 3, 2, 3, 1, 1, 2, 3, 3, 2), nrow = 1)
split(seq_len(ncol(m1)), m1[1, ])

为您提供所需元素的列表。我假设您并不想创建向量ab并且c

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

$`1`
[1] 1 2 6 7

$`2`
[1]  4  8 11

$`3`
[1]  3  5  9 10
于 2013-03-06T12:00:01.153 回答
0

您可以使用by按重复元素分组并返回它们的行名。

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"
于 2013-03-06T12:05:39.990 回答
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]]
于 2013-03-06T12:00:47.090 回答