2012-12-02 19 views
5

के साथ एक सरल पाश मैं data.table का उपयोग कर एक सरल पाश करना चाहते हैं। मैं 20 दिचोतोमोउस (0,1) चर (var_20 को VAR_1 से) है और मैं इस के लिए एक पाश करना चाहते हैं:data.table

dat[var_1==1, newvar:=1] 
dat[var_2==1, newvar:=2] 
dat[var_3==1, newvar:=3] 
... 
dat[var_20==1, newvar:=21] 

मेरा मुख्य समस्या मैं कैसे निर्दिष्ट मैं (यानी VAR_1 = नहीं जानता है = 1, var_2 == 2 ...) एक लूप का उपयोग कर। एक छोटी उदाहरण नीचे:

var_1 <- c(1, rep(0,9)) 
var_2 <- c(0,1, rep(0,8)) 
var_3 <- c(0,0,1, rep(0,7)) 
dat <- data.table(var_1, var_2, var_3) 

dat[var_1==1, newvar:=1] 
dat[var_2==1, newvar:=2] 
dat[var_3==1, newvar:=3] 

कैसे एक पाश के साथ ऐसा करने के बारे में कोई भी विचार? धन्यवाद!

उत्तर

4

डेटाटेबल क्लास का लाभ लेने के लिए कुंजी सेट करना बेहतर है।

dat[ ,newvar:= NA_integer_] 
for(i in ncol(dat)) { 
setkeyv(dat, names(dat)[i]) 
dat[J(1), newvar:=i] 
} 
+0

धन्यवाद। क्या आप जानते हैं कि नयावारा कैसे करें: = 1L चर से 1 की संख्या तक बढ़ता है (उदाहरण के लिए, newvar var_2 के लिए 2 के बराबर होना चाहिए, var_3 के लिए 3, और इसी तरह)। यह भी संभव है कि कुछ चर एक मूल्य के 1 एक साथ है, उस मामले में, मैं सिर्फ बड़ा मूल्य आरोपित चाहते हैं (उदाहरण के लिए, एक मामले VAR_1 = 1 और var_3 = 1 है, मैं पाने के लिए newvar = चाहते हैं 3)। – sdaza

+0

उपरोक्त कोड को यह करना चाहिए। मैं बड़े data.tables पर – mnel

+0

@WojciechSobala आमतौर पर यह बेहतर है setkey लेकिन setkey छँटाई करने की प्रक्रिया में स्तंभ (स्कैन) में हर मूल्य को पढ़ने के लिए है अनुक्रमिक लेकिन एकल वेक्टर स्कैन की तुलना में बार-बार की स्थापना चाबियों का प्रदर्शन में रुचि होगी यह। तो एक कॉलम पर एकल मान के लिए एकल स्कैन के विशेष मामले में, एक वेक्टर स्कैन सेटकी + से जुड़ना चाहिए। हालांकि परीक्षण के लायक, मैंने खुद का परीक्षण नहीं किया है। –

4

कुछ इस तरह काम करेगा।

nams <- names(dat) 
for(n in seq_along(nams)){ 
    nam <- nams[n] 
    char <- sprintf('%s==1',nam) 
    dat[eval(parse(text=char)), newvar := n] 
} 
dat 
var_1 var_2 var_3 newvar 
1:  1  0  0  1 
2:  0  1  0  2 
3:  0  0  1  3 
4:  0  0  0  NA 
5:  0  0  0  NA 
6:  0  0  0  NA 
7:  0  0  0  NA 
8:  0  0  0  NA 
9:  0  0  0  NA 
10: 0  0  0  NA 
+0

यह काम किया, धन्यवाद! – sdaza

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