2012-01-24 11 views
6

मेरे पास 9 कॉलम का डेटाफ्रेम है जिसमें कारकों की एक सूची शामिल है। प्रत्येक पंक्ति में सभी 9 कॉलम भर सकते हैं (जैसा कि उस पंक्ति में 9 "चीजें" हो रही हैं), लेकिन अधिकतर नहीं (अधिकांश में 3-4 के बीच होता है)। कॉलम या तो विशिष्ट नहीं हैं, जैसे कि आइटम 200 कॉलम 1 और 3 में दिखाई देता है, यह वही बात है। मैं एक मैट्रिक्स बनाना चाहता हूं जो प्रत्येक पंक्ति के लिए बाइनरी है जिसमें सभी कारक शामिल हैं।प्रति पंक्ति सूची का बाइनरी मैट्रिक्स कैसे बनाएं? (आर)

पूर्व (4 कॉलम के लिए छोटा बस भर में बात पाने के लिए)

R1 3 4 5 8 
R2 4 6 7 NA 
R3 1 5 NA NA 
R4 2 6 8 9 

 1 2 3 4 5 6 7 8 9 
r1 0 0 1 1 1 0 0 1 0 
r2 0 0 0 1 0 1 1 0 0 
r3 1 0 0 0 1 0 0 0 0 
r4 0 1 0 0 0 1 0 1 1 

मैं writeBin/readBin, कश्मीर क्लस्टरिंग (देखा है में बदल जाते हैं चाहिए जो मैं कुछ है करना पसंद है, लेकिन मुझे पहले एनएएस से छुटकारा पाना होगा), अस्पष्ट क्लस्टरिंग, टैग क्लस्टरिंग। बस किस दिशा में जाना है इसके बारे में थोड़ी देर खो गई।

मैंने लूप के लिए दो लिखने की कोशिश की है जो मैट्रिक्स से डेटा को स्तंभ/पंक्ति से खींचती है और फिर क्रमशः 0 और 1s को नए मैट्रिक्स में सहेजती है, लेकिन मुझे लगता है कि स्कोप मुद्दे थे।

आप लोग सबसे अच्छे हैं। धन्यवाद!

उत्तर

5

यहाँ एक आधार आर समाधान है:

# Read in the data, and convert to matrix form 
df <- read.table(text = " 
3 4 5 8 
4 6 7 NA 
1 5 NA NA 
2 6 8 9", header = FALSE) 
m <- as.matrix(df) 

# Create a two column matrix containing row/column indices of cells to be filled 
# with 'one's 
id <- cbind(rowid = as.vector(t(row(m))), 
      colid = as.vector(t(m))) 
id <- id[complete.cases(id), ] 

# Create output matrix 
out <- matrix(0, nrow = nrow(m), ncol = max(m, na.rm = TRUE)) 
out[id] <- 1 
#  [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9] 
# [1,] 0 0 1 1 1 0 0 1 0 
# [2,] 0 0 0 1 0 1 1 0 0 
# [3,] 1 0 0 0 1 0 0 0 0 
# [4,] 0 1 0 0 0 1 0 1 1 
+0

+1 वह cbind बिट मेरे दिमाग को उड़ाता है। –

+0

जोश, यह प्रभावशाली है। क्या इसके लिए एक शब्द कहा जाता है? मैं इन्वेंट्री मैट्रिक्स, आइटम मैट्रिक्स, या बाइनरी मैट्रिक्स सोच रहा था, लेकिन ये सभी अन्य विचारों से संबंधित प्रतीत होते हैं। –

+0

धन्यवाद। मैं * के बारे में सोचता हूं * नतीजे/अनुपस्थिति मैट्रिक्स के [संकेतक फ़ंक्शन] (http://en.wikipedia.org/wiki/Indicator_function) के बाद परिणाम (यानी संकेतक मैट्रिक्स के बाद) (क्योंकि यह एन्कोड करता है या नहीं प्रत्येक आइटम किसी दिए गए पंक्ति में मौजूद या अनुपस्थित है)। निश्चित नहीं है कि इसके लिए एक स्वीकार्य सामान्य नाम है, हालांकि। –

3

इस चाल करना चाहिए:

# The Incantation 
options(stringsAsFactors = FALSE) 

library(reshape2) 

# Your example data 
dat <- data.frame(id = c("R1", "R2", "R3", "R4"), 
        col1 = c(3, 4, 1, 2), 
        col2 = c(4, 6, 5, 6), 
        col3 = c(5, 7, NA, 7), 
        col4 = c(8, NA, NA, 9) 
) 

# Melt it down 
dat.melt <- melt(dat, id.var = "id") 

# Cast it back out, with the row IDs remaining the row IDs 
# and the values of the columns becoming the columns themselves. 
# dcast() will default to length to aggregate records - which means 
# that the values in this data.frame are a count of how many times 
# each value occurs in each row's columns (which, based on this data, 
# seems to be capped at just once). 
dat.cast <- dcast(dat.melt, id ~ value) 

परिणाम:

dat.cast 
    id 1 2 3 4 5 6 7 8 9 NA 
1 R1 0 0 1 1 1 0 0 1 0 0 
2 R2 0 0 0 1 0 1 1 0 0 1 
3 R3 1 0 0 0 1 0 0 0 0 2 
4 R4 0 1 0 0 0 1 1 0 1 0 
1

इन सभी महान जवाब नहीं है। सोचा कि मैं मूल समाधान में योगदान दूंगा जो मैंने लिखा था कि मेरा एक दोस्त वास्तव में काम करने के लिए संशोधित हुआ है।

for(i in seq(nrow(x))) 
    for(j in seq(ncol(x))) 
    if(!is.na(x[i,j])) { y[i, x[i,j]] = 1 } 

कुछ पहले पैरामीटर सेट करने के बाद दो लूप काम करता है, लेकिन यह अविश्वसनीय रूप से धीमा है। ऐसा लगता है कि इन अन्य समाधानों का काम बहुत तेज है!

संबंधित मुद्दे