2012-02-29 6 views
7

मेरे पास नामांकित पंक्तियों ('ए' और 'बी') के साथ एक लॉजिकल मैट्रिक्स x है और नाम कॉलम ('10', '20', '30', '40') हैं। मान लें, इस:आर: मैट्रिक्स के वास्तविक तत्वों की पंक्ति और कॉलम नाम कैसे प्राप्त करें?

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

वहाँ एक तालिका पंक्तियों और स्तंभों जहां मैं सच मान का नाम सूची जाएगा प्राप्त करने के लिए एक छोटी रास्ता नहीं है? यही कारण है, मैं निम्न तालिका प्राप्त करना चाहते हैं:

a 10, 30 
b 20, 40 

which(x, arr.ind = T) से कुछ इसी तरह की प्राप्त किया जा सकता है, जो

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

पैदा करता है लेकिन मैं वास्तव में पहली तालिका प्राप्त करना चाहते हैं।

उत्तर

11

आप सीधे apply का उपयोग कर सकते हैं।

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

+1: 'टी (टी (लागू (एम, 1, समारोह (यू) पेस्ट (नाम (जो (यू)), पतन = ",")))) 'अनुरोधित परिणाम के करीब भी है और आगे के बदलाव हैं – Henry

2

आपने इसे निर्दिष्ट नहीं किया है, लेकिन आपके वांछित आउटपुट की आवश्यकता होगी कि हम मान लें कि परिणाम वास्तव में आयताकार है। अर्थात्, हमें बी के लिए केवल 2 कॉलम नामों के लिए 3 कॉलम नाम नहीं मिलते हैं।

मुझे लगता है कि यह मिलना चाहिए आप शुरू में कम से कम,:

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 

जो इच्छित जानकारी देता है, लेकिन एक सुरक्षित "लंबे" प्रारूप है, जो गैर आयताकार मामले पर गला घोंटना नहीं होंगे में। एक बार वहाँ, आप इसे फिर से संगठित कर सकता है के रूप में आप इस तरह निर्दिष्ट:

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

लेकिन स्पष्ट रूप से है कि पिछले बिट मैं वास्तव में बदसूरत मिल जाए, और मैं हैरान करता है, तो एक बेहतर समाधान पॉप अप होता है अगर आप थोड़ा इंतज़ार नहीं होगा ।

0

आप तथ्य यह है कि table वस्तुओं as.data.frame() से करने के लिए "लंबे" प्रारूप डेटा फ्रेम बदल दिया जाता है का उपयोग कर सकते हैं:

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

जिसके परिणामस्वरूप df निम्नलिखित है:

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 

आप कौन सा तब सूचकांक केवल TRUE पंक्तियों को रखने के लिए कर सकते हैं:

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

आप dplyr का उपयोग वास्तव में तालिका में इस कन्वर्ट करने के लिए कर सकते हैं आप चाहते हैं:

library(plyr) 
ddply(df, "Var1", function(x) x$Var2) 
    Var1 V1 V2 
1 a 10 30 
2 b 20 40 
संबंधित मुद्दे