2012-02-29 36 views
7

Mantıksal bir matris x adında bir satır var ('a' ve 'b') ve adlandırılmış sütunlar ('10', '20', '30', '40'). Bu Diyelim:R: Matrisin gerçek öğelerinin satır ve sütun adlarını nasıl alırsınız?

10 20 30 40 
a T F T F 
b F T F T 

structure(c(TRUE, FALSE, FALSE, TRUE, TRUE, FALSE, FALSE, TRUE), 
.Dim = c(2L, 4L), .Dimnames = list(c("a", "b"), c("10", "20", "30", "40"))) 

satır ve ben gerçek değerlere sahip sütunların adlarla listelenir bir tablo almak için kısa bir yolu var mı?

row col 
a 1 1 
b 2 2 
a 1 3 
b 2 4 

üretir which(x, arr.ind = T) elde edilebilir benzer

a 10, 30 
b 20, 40 

şey, Ama gerçekten ilk tablo elde etmek istiyorum: Ben aşağıdaki tabloyu almak istiyorum vardır.

cevap

11

apply'u doğrudan kullanabilirsiniz.

Sen table nesneler as.data.frame() tarafından "uzun" formatında veri çerçeveleri dönüştürülür gerçeğini kullanabilirsiniz
+2

+1: 't (t (uygulamak (m, 1, fonksiyonu (u) macun (adları (ki (u)), daraltma = ",")))) 'istenen sonuca daha yakın ve daha fazla düzeltmeler var – Henry

2

Bunu belirtmediniz, ancak istediğiniz çıktı, sonucun aslında dikdörtgen olduğunu varsaymamız gerektiğini gerektirecektir. Yani, biz b için 3 sütun isimleri ve b için sadece 2 sütun isimleri almazsınız.

ben bu en azından başlamak gerektiğini düşünüyorum:

istediğiniz bilgileri döndürür, ancak dikdörtgen olmayan durumda boğulmaya olmaz daha güvenli "uzun" biçiminde
m <- structure(c(TRUE, FALSE, FALSE, TRUE, TRUE, FALSE, FALSE, TRUE), 
.Dim = c(2L, 4L), .Dimnames = list(c("a", "b"), c("10", "20", "30", "40"))) 

rr <- rownames(m)[row(m)[which(m)]] 
cc <- colnames(m)[col(m)[which(m)]] 

dd <- data.frame(rr = rr,cc = cc) 
dd 

. Böyle belirtilen ulaştıktan sonra, yeniden organize:

library(plyr) 
ddply(dd,.(rr),function(x){ x$cc }) 

ama açıkçası bu son bit gerçekten çirkin buluyorsunuz, biraz beklerseniz daha iyi bir çözüm çıkacak mı ben şaşırmam

.

0

apply(
    x, 1, 
    function(u) paste(names(which(u)), collapse=",") 
) 
:

# Create matrix of interest 
mat <- structure(c(TRUE, FALSE, FALSE, TRUE, TRUE, FALSE, FALSE, TRUE), .Dim = c(2L, 4L), .Dimnames = list(c("a", "b"), c("10", "20", "30", "40"))) 

# Convert to table, then to long data.frame 
df <- mat %>% as.table %>% as.data.frame(., stringsAsFactors=FALSE) 

çıkan df şudur:

Var1 Var2 Freq 
1 a 10 TRUE 
2 b 10 FALSE 
3 a 20 FALSE 
4 b 20 TRUE 
5 a 30 TRUE 
6 b 30 FALSE 
7 a 40 FALSE 
8 b 40 TRUE 

hangisi sizi daha sonra yalnızca TRUE satırını tutmak için dizin oluşturabilir:

df <- df[df$Freq,1:2] %>% sort 
df 
     Var1 Var2 
    1 a 10 
    5 a 30 
    4 b 20 
    8 b 40 

Sen tam olarak istediğiniz tabloya dönüştürmek amacıyla dplyr kullanabilirsiniz:

library(plyr) 
ddply(df, "Var1", function(x) x$Var2) 
    Var1 V1 V2 
1 a 10 30 
2 b 20 40 
İlgili konular