2011-10-05 11 views
18

मैं किसी अन्य कॉलम में 4 मानों के आधार पर एक नया कॉलम बनाना चाहता हूं।किसी अन्य कॉलम में 4 मानों के आधार पर नया कॉलम बनाएं

if col1=1 then col2= G; 
if col1=2 then col2=H; 
if col1=3 then col2=J; 
if col1=4 then col2=K. 

मैं इसे आर में कैसे करता हूं? कृपया मुझे इसका समाधान करने में मदद करने के लिए किसी की आवश्यकता है। मैंने कोशिश की है अगर/else और ifelse लेकिन कोई भी काम नहीं कर रहा है। धन्यवाद

+0

आप किस प्रोग्रामिंग भाषा का उपयोग कर रहे हैं? –

+2

@TheGiG ओपी ने [टैग: आर] – Andrie

+0

से संबंधित प्रश्न को चिह्नित किया है: [केस स्टेटमेंट समकक्ष] (http://stackoverflow.com/q/4622060/168747), [डेटा में कॉलम कैसे जोड़ें। फ्रेम'?] (http://stackoverflow.com/q/4562547/168747), [एक्सेल शीट्स में डेटा सफाई] (http://stackoverflow.com/q/7374314/168747) (इस लिंक में एक और सेट)। – Marek

उत्तर

15

आपके पास मूल्यों को देखने का एक विशेष मामला है जहां इंडेक्स पूर्णांक संख्या 1: 4 है। इसका मतलब है कि आप अपनी समस्या को एक आसान चरण में हल करने के लिए वेक्टर इंडेक्सिंग का उपयोग कर सकते हैं।

सबसे पहले, कुछ नमूना डेटा बनाने के लिए:

set.seed(1) 
dat <- data.frame(col1 = sample(1:4, 10, replace = TRUE)) 

इसके बाद, देखने मान निर्धारित करने, और [ subsetting का उपयोग वांछित परिणाम को खोजने के लिए:

values <- c("G", "H", "J", "K") 
dat$col2 <- values[dat$col1] 

परिणाम:

dat 
    col1 col2 
1  2 H 
2  2 H 
3  3 J 
4  4 K 
5  1 G 
6  4 K 
7  4 K 
8  3 J 
9  3 J 
10 1 G 

index <- c(1, 2, 3, 4) 
values <- c("G", "H", "J", "K") 
dat$col2 <- values[match(dat$col1, index)] 
dat 
    col1 col2 
1  2 H 
2  2 H 
3  3 J 
4  4 K 
5  1 G 
6  4 K 
7  4 K 
8  3 J 
9  3 J 
10 1 G 
5

ऐसा करने के कई तरीके हैं, लेकिन यहां एक है।

set.seed(357) 
mydf <- data.frame(col1 = sample(1:4, 10, replace = TRUE)) 
mydf$col2 <- rep(NA, nrow(mydf)) 
mydf[mydf$col1 == 1, ][, "col2"] <- "A" 
mydf[mydf$col1 == 2, ][, "col2"] <- "B" 
mydf[mydf$col1 == 3, ][, "col2"] <- "C" 
mydf[mydf$col1 == 4, ][, "col2"] <- "D" 

    col1 col2 
1  1 A 
2  1 A 
3  2 B 
4  1 A 
5  3 C 
6  2 B 
7  4 D 
8  3 C 
9  4 D 
10 4 D 

यहाँ एक का उपयोग कर car के recode है।

library(car) 
mydf$col3 <- recode(mydf$col1, "1 = 'A'; 2 = 'B'; 3 = 'C'; 4 = 'D'") 

this question से एक और:

mydf$col4 <- c("A", "B", "C", "D")[mydf$col1] 
1

आप ?symnum पर एक नज़र हो सकता था।

आपके मामले में, की तरह कुछ:

col2<-symnum(col1, seq(0.5, 4.5, by=1), symbols=c("G", "H", "J", "K")) 

आप बंद मिलना चाहिए।

21

आप नेस्ट इस्तेमाल कर सकते हैं ifelse: +४६५१०४०३२१० आम तौर पर, आप इस तरह की समस्या को हल करने के [ subsetting match के साथ संयुक्त का उपयोग कर सकते

col2 <- ifelse(col1==1, "G", 
     ifelse(col1==2, "H", 
     ifelse(col1==3, "J", 
     ifelse(col1==4, "K", 
         NA )))) # all other values map to NA 

इस सरल मामले में यह overkill है में, लेकिन और अधिक जटिल के लिए वाले ...

+1

"लेकिन अधिक जटिल लोगों के लिए ..." - अधिक जटिल लोग नेस्टेड 'ifelse' एक ** बेहतर ** विचार बनाते हैं? यह मेरे लिए counterintuitive है। –

+0

@TheRedPea अधिक जटिल स्थितियों के लिए, विभिन्न स्तंभों के आधार पर, प्रत्येक-दूसरे से संबंधित नहीं, आदि। एक शर्त के लिए एक पंक्ति। – Marek

+0

हाँ, मुझे लगता है कि अगर कोई बयान के साथ तर्क व्यक्त करने के अलावा कोई विकल्प नहीं हो सकता है। –

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