आर

2017-01-17 10 views
7

में संबंधित कॉलम में वेक्टर और स्ट्रिंग में उच्चतम मूल्य लौटाएं मेरे पास एकाधिक परियोजनाओं पर डेटा है, जहां प्रत्येक प्रोजेक्ट व्यक्तियों की एक टीम से बना है। मैं तो जैसे उनके स्तर और उनके लिंग के बारे में जानकारी है,:आर

df <- read.table(header = TRUE, text = 'Project GenderA RankA GenderB RankB GenderC RankC 
      100 1 3 0 1 1 2 
      200 1 2 1 2 NA NA 
      300 0 3 1 3 0 2 
      400 0 1 NA NA NA NA 
      500 1 1 0 2 1 1') 

प्रत्येक परियोजना के लिए, मैं आर टीम पर सर्वोच्च पद और उस व्यक्ति के लिंग के साथ एक नया चर बनाना चाहते हैं।

Project GenderA RankA GenderB RankB GenderC RankC HighGen HighRank 
    100  1  3  0  1  1  2  1  3 

मैं Pmax साथ उच्चतम स्तर प्राप्त कर सकते हैं:

df<-cbind(df, 
    HighRank = pmax(df$RankA, df$RankB, df$RankC)) 

लेकिन यह (है कि कोई NAS के साथ है) केवल परियोजनाओं है कि पूरा कर रहे हैं के लिए काम करता है, और लिंग स्तंभ के साथ संबद्ध नहीं है। दोनों करने का सबसे अच्छा तरीका क्या है?

+1

आप संबंधों को कैसे संभालना चाहते थे? – ulfelder

उत्तर

9

यह एक स्वच्छंद जवाब है, लेकिन कारण यह है कि इस एक ही बार में करने के लिए कठिन है कि आपके डेटा साफ नहीं है। इसका मतलब है कि इस मामले में आप प्रत्येक पंक्ति को एक अवलोकन करना चाहते हैं।

library(dplyr) 

df <- read.table(header = TRUE, text = 'Project Gender Rank order 
      100 1 3 A 
      100 0 1 B 
      100 1 2 C 
      200 1 2 A 
      200 1 2 B 
      200 NA NA C 
      300 0 3 A 
      300 1 3 B 
      300 0 2 C') 

df %>% group_by(Project) %>% arrange(-Rank) %>% slice(1) %>% ungroup() 

कि अंतिम पंक्ति की व्याख्या करने के लिए, परियोजना द्वारा समूह आप, तरह सभी रैंक के आधार पर उन परियोजनाओं में स्कोर, तो पहले के लिए फ़िल्टर, और अंत में: मैं 'साफ' प्रतिनिधित्व और एक समाधान dplyr पैकेज का उपयोग देना , अच्छे उपाय के लिए, आप समूह को भूल जाते हैं, जिसका अर्थ है कि आप समूह को भूल जाते हैं। आपका आउटपुट तब प्रत्येक प्रोजेक्ट के लिए उच्चतम स्कोरिंग रिकॉर्ड है, जिसमें इसके स्कोर, लिंग शामिल हैं। ध्यान दें कि मैंने 'रैंक ए' या 'रैंक बी' इत्यादि के तहत डेटा को बनाए गए तथ्य को दर्शाने के लिए एक नया चर 'ऑर्डर' भी लगाया है।

आउट:

| Project| Gender| Rank|order | 
|-------:|------:|----:|:-----| 
|  100|  1| 3|A  | 
|  300|  0| 3|A  | 
|  200|  1| 2|A  | 

साफ प्रतिनिधित्व में डेटा को अलग रूप में अच्छी तरह से किया जा सकता है, लेकिन क्या आप पहली जगह में डेटा दर्ज करने के बाद कैसे को देखने के लिए चाहते हो सकता है। यह साफ-सफाई के लिए है, लेकिन व्यापक पढ़ने के लिए आप http://vita.had.co.nz/papers/tidy-data.pdf देख सकते हैं।

| Project|order | Gender| Rank| 
|-------:|:-----|------:|----:| 
|  100|A  |  1| 3| 
|  100|B  |  0| 1| 
|  100|C  |  1| 2| 
|  200|A  |  1| 2| 
|  200|B  |  1| 2| 
|  200|C  |  NA| NA| 
|  300|A  |  0| 3| 
|  300|B  |  1| 3| 
|  300|C  |  0| 2| 
|  400|A  |  0| 1| 
|  400|B  |  NA| NA| 
|  400|C  |  NA| NA| 
|  500|A  |  1| 1| 
|  500|B  |  0| 2| 
|  500|C  |  1| 1| 

फिर आप को खिलाने के कर सकते हैं:

ग्रेगर की टिप्पणी के लिए धन्यवाद, यहाँ एक तरह से एक और अधिक सुव्यवस्थित प्रतिनिधित्व में अपने dataframe कन्वर्ट करने के लिए

library(tidyr) 


df <- read.table(header = TRUE, text = 'Project GenderA RankA GenderB RankB GenderC RankC 
      100 1 3 0 1 1 2 
      200 1 2 1 2 NA NA 
      300 0 3 1 3 0 2 
      400 0 1 NA NA NA NA 
      500 1 1 0 2 1 1') 

df %>% gather(key = key, value = value, -Project) %>% separate(key, into = c("variable", "order"), sep = -2) %>% spread(key = variable, value = value) 

आउट (पैकेज tidyr का उपयोग) है यह आपके समाधान को प्राप्त करने के लिए पहले भाग में सूत्र में है।

+5

मैं सिर्फ उस उत्तर पर काम कर रहा था जो मूल रूप से यह है। 'Dplyr' और' tidyr' का उपयोग कर डेटा को साफ करने के लिए कोड: 'op_df%>% इकट्ठा करें (कुंजी = कुंजी, मान = मान, -प्रोजेक्ट)%>% अलग (कुंजी, = = सी ("चर", "ऑर्डर"), सीपी = -2)%>% फैल (कुंजी = परिवर्तनीय, मूल्य = मान) '। अपने प्रश्न में इसे संपादित करने के लिए स्वतंत्र महसूस करें। – Gregor