2013-03-06 29 views
6

aşağıdaki biçimdebirleştiren kolon numarası

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

bir matris olması ve istenilen çıkış (aynı değerlere sahip olan sütun sayıları birleştirerek) aşağıdakiler.

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

'a',' b', 'C' veya' obj1', 'obj2' vb aslında sahte bir liste oluşturduk Gerçek bir olanla çalışmak çok daha zordur. Biraz daha zarif bir çözüm için – Backlin

cevap

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

size arzu öğeleriyle bir listesini verir. Ben gerçekten vektörleri a, b ve 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 
0

Sorunuz biraz tuhaf ve ben bir kaç ayrıntı eksik şüpheli oluşturmak istemiyoruz varsayalım. Tam olarak istediğin şeyi almak biraz tıkalı.

##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 

Sonra benzersiz değerler seçmemde:

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

gerektiği gibi size vektörleri oluşturmak: Öncelikle bazı verileri oluşturmak

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 

Ancak bu ölçeklenebilir değil (veya zarif). Eğer değerler bir çift daha varsa, aşırı v yineleme isteyeceksiniz, bu yüzden bir şey gibi:

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

değişken l bir listedir. kullanmak,

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

şu tek tek öğeleri erişmek için size yeterli olacaktır listesini verir:

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 

Ama gerçekten ortamınızda değişkenleri gerekiyorsa, o zaman yapabilirsiniz:

attach(aList) 
+0

(+1) – adibender

0

by numaralı öğeyi kopyalamak için yinelenen öğeler gruplandırın ve onların adlarını döndürün.

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." 

DÜZENLEME güzel çıktı

Eğer nesnelerin adını her
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"