2017-01-12 7 views
11
dummies = matrix(c(0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 
0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0), nrow=6, ncol=6) 
colnames(dummies) <- c("a","b", "c", "d", "e", "f") 

मैं dummies के साथ एक मैट्रिक्सकई शर्तों के साथ पाश के लिए की Vectorisation

> dummies 
    a b c d e f 
[1,] 0 0 0 0 1 0 
[2,] 0 0 1 0 0 0 
[3,] 1 0 0 0 0 0 
[4,] 0 0 0 0 0 1 
[5,] 0 1 0 0 0 0 
[6,] 0 0 0 1 0 0 

मुझे पता है कि मेरी dummies कि लाइन 1 2 के साथ समूहीकृत है, 3 से 4 के साथ में जुड़े हुए हैं, और 5 से 6 के साथ । मैं ऊपर के रूप में एक ही लाइन पर एक ही समूह में उन लोगों के बीच प्रत्येक डमी कोड (1) विभाजित करना चाहते हैं:

> dummies 
     a b c d e f 
[1,] 0.0 0.0 -0.5 0.0 0.5 0.0 
[2,] 0.0 0.0 0.5 0.0 -0.5 0.0 
[3,] 0.5 0.0 0.0 0.0 0.0 -0.5 
[4,] -0.5 0.0 0.0 0.0 0.0 0.5 
[5,] 0.0 0.5 0.0 -0.5 0.0 0.0 
[6,] 0.0 -0.5 0.0 0.5 0.0 0.0 

इस लक्ष्य को हासिल करने के लिए, मैं निम्नलिखित है:

dummies <- ifelse(dummies==1, 0.5, 0) 
for (i in 1:nrow(dummies)){ 
    column = which(dummies[i,] %in% 0.5) 
    if (i %% 2 != 0) {  
     dummies[i+1, column] <- -0.5 
    } else {    
     dummies[i-1, column] <- -0.5 
    } 
} 

मेरा सवाल यह है कि क्या मैं इसे वेक्टरिज्ड कोड के साथ प्राप्त कर सकता हूं। मैं इस मामले में ifelse का उपयोग करने का तरीका नहीं समझ सकता क्योंकि मैं प्रत्येक पंक्ति पर 0.5 खोजने के लिए इसे लाइन इंडेक्सिंग के साथ संयोजित नहीं कर सकता।

उत्तर

12

यहाँ आधार आर

# get locations of ones 
ones <- which(dummies == 1) 
# get adjacent locations 
news <- ones + c(1L, -1L)[(ones %% 2 == 0L) + 1L] 

# fill out matrix 
dummiesDone <- dummies * 0.5 
dummiesDone[news] <- -0.5 

dummiesDone 
     a b c d e f 
[1,] 0.0 0.0 -0.5 0.0 0.5 0.0 
[2,] 0.0 0.0 0.5 0.0 -0.5 0.0 
[3,] 0.5 0.0 0.0 0.0 0.0 -0.5 
[4,] -0.5 0.0 0.0 0.0 0.0 0.5 
[5,] 0.0 0.5 0.0 -0.5 0.0 0.0 
[6,] 0.0 -0.5 0.0 0.5 0.0 0.0 

यह समाधान में एक प्रयास तथ्य यह है कि एक मैट्रिक्स बस एक आयाम विशेषता के साथ एक वेक्टर है का उपयोग करता है। which अंतर्निहित वेक्टर में 1s का स्थान पाता है।

दूसरी पंक्ति में दूसरा शब्द, c(1, -1)[(ones %% 2 == 0L) + 1L] वेक्टर के "जोड़ी" तत्व के चयन की अनुमति देता है जिसका उपयोग मूल्य को विभाजित करने के लिए किया जाएगा, मूल स्थिति चाहे या विषम है या नहीं। यह यहां काम करता है क्योंकि यहां तक ​​कि पंक्तियों की संख्या भी है, जो युग्मित तत्वों की इस समस्या में आवश्यक है।

अगली पंक्तियां मूल रूप से एक (0.5) या यह एक आसन्न, जोड़ी तत्व (-0.5) है या नहीं, इसके आधार पर मैट्रिक्स भरें। ध्यान दें कि दूसरा आदेश अंतर्निहित वेक्टर स्थिति अवधारणा का शोषण करता है।


एक दूसरी विधि है कि hubertl, thelatemail, और मार्टिन-मॉर्गन से पोस्ट और टिप्पणियाँ है कि सही स्थानों में मूल मैट्रिक्स से 0.5 घटाना की अवधारणा के बंद उधार लेता है पहले सूचकांक

ऊपर के रूप में ही प्राप्त करने के लिए
# get locations of ones 
ones <- which(dummies == 1) 
# get adjacent locations 
news <- ones + c(1L, -1L)[(ones %% 2 == 0L) + 1L] 

और फिर घटाव

dummies[c(ones, news)] <- dummies[c(ones, news)] - .5 
dummies 
     a b c d e f 
[1,] 0.0 0.0 -0.5 0.0 0.5 0.0 
[2,] 0.0 0.0 0.5 0.0 -0.5 0.0 
[3,] 0.5 0.0 0.0 0.0 0.0 -0.5 
[4,] -0.5 0.0 0.0 0.0 0.0 0.5 
[5,] 0.0 0.5 0.0 -0.5 0.0 0.0 
[6,] 0.0 -0.5 0.0 0.5 0.0 0.0 
+0

'स्वीकृत' उत्तर चुना गया। धन्यवाद। – Tony

5

यहाँ के साथ [<- गठबंधन एक और तरीका है:

dummies[] <- sapply(split(dummies, gl(length(dummies)/2,2)), function(v) if(any(!!v))v-.5 else v) 
     a b c d e f 
[1,] 0.0 0.0 -0.5 0.0 0.5 0.0 
[2,] 0.0 0.0 0.5 0.0 -0.5 0.0 
[3,] 0.5 0.0 0.0 0.0 0.0 -0.5 
[4,] -0.5 0.0 0.0 0.0 0.0 0.5 
[5,] 0.0 0.5 0.0 -0.5 0.0 0.0 
[6,] 0.0 -0.5 0.0 0.5 0.0 0.0 
4

एक और दृष्टिकोण:

dummies - ((dummies[c(1,3,5),]+dummies[c(2,4,6),])/2)[c(1,1,2,2,3,3),] 

     a b c d e f 
[1,] 0.0 0.0 -0.5 0.0 0.5 0.0 
[2,] 0.0 0.0 0.5 0.0 -0.5 0.0 
[3,] 0.5 0.0 0.0 0.0 0.0 -0.5 
[4,] -0.5 0.0 0.0 0.0 0.0 0.5 
[5,] 0.0 0.5 0.0 -0.5 0.0 0.0 
[6,] 0.0 -0.5 0.0 0.5 0.0 0.0 
+2

भिन्नता - '(डमीज - डमीज [सी (2: 1,4: 3,6: 5),])/2' – thelatemail

6

पंक्ति समूहों, grp का संकेत एक वेक्टर बनाएँ, और घटाना समूह का मतलब है समूह के प्रत्येक सदस्य से rowsum(dummies, grp)/2, के रूप में

grp = rep(seq_len(nrow(dummies)/2), each=2) 
dummies - rowsum(dummies, grp)[grp,]/2 

एक छोटे से अधिक आम तौर पर, विभिन्न आकार और अनुक्रमित समूहों के लिए अनुमति

dummies - (rowsum(dummies, grp)/tabulate(grp))[grp,] 
स्पष्ट और विस्तृत स्पष्टीकरण के आधार पर
संबंधित मुद्दे