2013-01-07 12 views
10

मैं इस तरह एक dataframe अगर:डेटा फ्रेम में अन्य स्तंभों के लिए और प्रयोग पर आधारित स्तंभ मान जोड़ने

 id  adit  diag1 diag2  
     2  3   4230 2234   
     3  5   3345 4456   
     4  6   4567 4467 

मैं अन्य 2 कॉलम, dse1 और dse2 नीचे छद्म कोड का उपयोग कर जोड़ना चाहते हैं:

if diag1 contains 4230 then dse1 = 1 else dse1 = 0 

if diag2 contains 4567 then dse2 =1 else dse2 = 0 

मैं इस प्रयोग किया है:

for (i in 1 : nrow(dse)){ 
    for (j in 3: ncol(dse)){ 
    if dse[i,j] %in% ("4320"){dse$dse1 = 1} 
     else{dse$dse1 = 0} 
    if dse[i,j] %in% ("4567"){dse$dse2 = 1} 
     else{dse$dse2 = 0} 
    } 
} 

लेकिन इन नहीं करना टी काम नहीं

+0

नीचे दिए गए सभी उत्तर सही मार्ग हैं। हालांकि, अगर आप 'if/else' का उपयोग कर रहे हैं तो' '' आपके 'if' कथन से '' 'को बंद करने के समान ही लाइन पर होना चाहिए। के लिए – Justin

+0

(मैं 1: Nrow (दिल्ली शेयर बाजार)) { के लिए (3 में j: ncol (दिल्ली शेयर बाजार)) { अगर (दिल्ली शेयर बाजार [i, j] == 4230) { दिल्ली शेयर बाजार $ dse1 = 1 } else { दिल्ली शेयर बाजार $ dse1 = 0 } अगर (दिल्ली शेयर बाजार [i, j]% में% (4567)) {दिल्ली शेयर बाजार $ dse2 = 1} else {दिल्ली शेयर बाजार $ dse2 = 0} } } मैं कोड बदलने के उपरोक्त के रूप में, कोई त्रुटि नहीं है, लेकिन परिणाम सही नहीं है। क्यूं कर? THnaks – user1582755

+0

सुनिश्चित नहीं है कि आपकी टिप्पणी क्या करें। आप आवश्यकतानुसार अपना प्रश्न संपादित कर सकते हैं। साथ ही, यदि नीचे दिए गए किसी भी उत्तर ने समस्या हल कर दी है, तो कृपया प्रश्न के आधार पर ग्रीन चेक मार्क पर क्लिक करके इसे उत्तर के रूप में चिह्नित करें ताकि हम सभी को इसका समाधान हो जाए। – Justin

उत्तर

18

कोई ज़रूरत नहीं है, उदाहरण के

dse = within(dse, { 
    dse1 = ifelse(diag1 == 4230, 1, 0) 
    dse2 = ifelse(diag2 == 4567, 1, 0) 
}) 
+4

मेरे पास डाउनवोट आ रहा था, बस कुछ उदाहरण कोड जोड़ा गया। –

+0

धन्यवाद। डीएसई 1 में कई निदान हो सकते हैं, यह है, अगर डीएसई [i, j]%% ("2345", "3456", "5678") {dse1 = 1)। और अगर कोड किसी भी चिंताजनक है? उन्हें कैसे ठीक करें – user1582755

+0

मुझे यकीन नहीं है कि आप क्या चाहते हैं, कृपया अपने प्रश्न में अधिक जानकारी जोड़ें। –

10

if/else का उपयोग न करें। में के रूप में vectorized जाओ: एक पाश का उपयोग करने के लिए, बस ifelse का उपयोग

dat$dse1 <- as.numeric(dat$diag1 == 4230) 
dat$dse2 <- as.numeric(dat$diag2 == 4567) 
+0

+1 अच्छा जवाब, अगर ऐसा लगता है कि 'ifelse' का उपयोग थोड़ा और पारदर्शी है। इसके अलावा, आपके पास '0' और' 1' से अन्य वैल भी हो सकते हैं। –

+1

यह निश्चित रूप से सबसे अच्छा जवाब है। 'ifelse (cond, 1, 0) 'का उपयोग कभी नहीं किया जाना चाहिए। –

4

के लिए आप transform उपयोग कर सकते हैं:

transform(dse, dse1 = as.numeric(diag1 == 4230), 
       dse2 = as.numeric(diag2 == 4567)) 
+0

धन्यवाद। डीएसई 1 में कई निदान हो सकते हैं, यह है, अगर डीएसई [i, j]%% ("2345", "3456", "5678") {dse1 = 1)। – user1582755

4
इस तरह

:

dse$dse1<-0 
dse$dse2<-0 
dse$dse1[dse$diag1==4230]<-1 
dse$dse2[dse$diag2==4567]<-1 

कृपया अपने आप को एक अच्छा आर ट्यूटोरियल प्राप्त करें (जैसे this) और इंडेक्स वैक्टर के बारे में सभी पढ़ें।

+0

सभी उत्तरों के लिए धन्यवाद।अगर हम इस तरह के बयान बदलते हैं तो diag1 या diag2 में 4230 है तो dse1 = 1 else dse1 = 0 यदि diag2 या diag1 में 4567 है तो dse2 = 1 else dse2 = 0 और कई डायग्स हैं जिनमें कई कोड हैं, इसलिए वहां कई डीएस हैं। साफ जवाब क्या हैं – user1582755

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