/ / श्रेणीबद्ध चर से नए डमी चर कॉलम बनाएं - आर

स्पष्ट चर से नए डमी परिवर्तनीय कॉलम बनाएं - आर

मेरे पास 75,000 टिप्पणियों और ए के साथ कई डेटा सेट हैं type वैरिएबल जो 0-4 के मान पर ले सकता है। मैं सभी प्रकारों के लिए प्रत्येक डेटा में पांच नए डमी वैरिएबल जोड़ना चाहता हूं। सबसे अच्छा तरीका है कि मैं ऐसा करने के लिए आ सकता है:

# For the "binom" data set create dummy variables for all types in all data sets
binom.dummy.list<-list()
for(i in 0:4){
binom.dummy.list[[i+1]]<-sapply(binom$type,function(t) ifelse(t==i,1,0))
}

# Add and merge data
binom.dummy.df<-as.data.frame(do.call("cbind",binom.dummy.list))
binom.dummy.df<-transform(binom.dummy.df,id=1:nrow(binom))
binom<-merge(binom,binom.dummy.df,by="id")

जबकि यह काम करता है, यह अविश्वसनीय रूप से धीमा है (मर्ज फ़ंक्शन भी कुछ बार क्रैश हो गया है)। क्या ऐसा करने का अधिक कुशल तरीका है? शायद यह कार्यक्षमता एक पैकेज का हिस्सा है जिससे मैं परिचित नहीं हूं?

उत्तर:

उत्तर № 1 के लिए 49

सूत्रों में अनुवाद करने के लिए R की एक "उप-भाषा" हैडिजाइन मैट्रिक्स, और भाषा की भावना में आप इसका लाभ उठा सकते हैं। यह तेज़ और संक्षिप्त है। उदाहरण: आपके पास एक कार्डिनल प्रेडिक्टर एक्स, एक श्रेणीबद्ध भविष्यवक्ता कैटवेर और एक प्रतिक्रिया वाई है।

> binom <- data.frame(y=runif(1e5), x=runif(1e5), catVar=as.factor(sample(0:4,1e5,TRUE)))
> head(binom)
y          x catVar
1 0.5051653 0.34888390      2
2 0.4868774 0.85005067      2
3 0.3324482 0.58467798      2
4 0.2966733 0.05510749      3
5 0.5695851 0.96237936      1
6 0.8358417 0.06367418      2

तुम बस करो

> A <- model.matrix(y ~ x + catVar,binom)
> head(A)
(Intercept)          x catVar1 catVar2 catVar3 catVar4
1           1 0.34888390       0       1       0       0
2           1 0.85005067       0       1       0       0
3           1 0.58467798       0       1       0       0
4           1 0.05510749       0       0       1       0
5           1 0.96237936       1       0       0       0
6           1 0.06367418       0       1       0       0

किया हुआ।


जवाब के लिए 24 № 2

आकर्षित किया, यह बहुत तेज है और किसी भी दुर्घटना का कारण नहीं होना चाहिए।

> binom <- data.frame(data=runif(1e5),type=sample(0:4,1e5,TRUE))
> for(t in unique(binom$type)) {
+   binom[paste("type",t,sep="")] <- ifelse(binom$type==t,1,0)
+ }
> head(binom)
data type type2 type4 type1 type3 type0
1 0.11787309    2     1     0     0     0     0
2 0.11884046    4     0     1     0     0     0
3 0.92234950    4     0     1     0     0     0
4 0.44759259    1     0     0     1     0     0
5 0.01669651    2     1     0     0     0     0
6 0.33966184    3     0     0     0     1     0

16 के लिए उत्तर № 3

Model.matrix () का उपयोग करने के बारे में क्या?

> binom <- data.frame(data=runif(1e5),type=sample(0:4,1e5,TRUE))
> head(binom)
data type
1 0.1412164    2
2 0.8764588    2
3 0.5559061    4
4 0.3890109    3
5 0.8725753    3
6 0.8358100    1
> inds <- model.matrix(~ factor(binom$type) - 1)
> head(inds)
factor(binom$type)0 factor(binom$type)1 factor(binom$type)2 factor(binom$type)3 factor(binom$type)4
1                   0                   0                   1                   0                   0
2                   0                   0                   1                   0                   0
3                   0                   0                   0                   0                   1
4                   0                   0                   0                   1                   0
5                   0                   0                   0                   1                   0
6                   0                   1                   0                   0                   0

जवाब के लिए 2 № 4

यदि आप "का उपयोग करने के लिए खुले हैं विवरण सारणी पैकेज, mltools one_hot () विधि है।

library(data.table)
library(mltools)

binom <- data.table(y=runif(1e5), x=runif(1e5), catVar=as.factor(sample(0:4,1e5,TRUE)))
one_hot(binom)

y          x catVar_0 catVar_1 catVar_2 catVar_3 catVar_4
1: 0.90511891 0.83045050        0        0        1        0        0
2: 0.91375984 0.73273830        0        0        0        1        0
3: 0.01926608 0.10301409        0        0        1        0        0
4: 0.48691138 0.24428157        0        1        0        0        0
5: 0.60660396 0.09132816        0        0        1        0        0
---
99996: 0.12908356 0.26157731        0        1        0        0        0
99997: 0.96397273 0.98959000        0        1        0        0        0
99998: 0.16818414 0.37460941        1        0        0        0        0
99999: 0.72610508 0.72055867        1        0        0        0        0
100000: 0.89710998 0.24155507        0        0        0        0        1

जवाब के लिए 0 № 5

ifelse सदिशीकृत है, इसलिए यदि मैं आपके कोड को सही ढंग से समझता हूं, तो आपको इसकी आवश्यकता नहीं है sapply। और मैं मर्ज का उपयोग नहीं करूंगा - मैं SQLite या PostgreSQL का उपयोग करूंगा।

कुछ सैंपल डेटा भी मदद करेंगे :-)


जवाब के लिए 0 № 6

व्यंजनों पैकेज भी ऐसा करने के लिए काफी शक्तिशाली हो सकता है। नीचे दिया गया उदाहरण काफी क्रियात्मक है लेकिन जैसे ही आप अधिक प्रीप्रोसेसिंग कदम जोड़ते हैं, यह वास्तव में साफ हो सकता है।

library(recipes)

binom <- data.frame(y = runif(1e5),
x = runif(1e5),
catVar = as.factor(sample(0:4, 1e5, TRUE))) # use the example from gappy
head(binom)

new_data <- recipe(y ~ ., data = binom) %>%
step_dummy(catVar) %>% # add dummy variable
prep(training = binom) %>% # apply the preprocessing steps (could be more than just adding dummy variables)
bake(newdata = binom) # apply the recipe to new data
head(new_data)

अन्य चरण उदाहरण हैं step_scale, step_center, step_pca, आदि।


उत्तर के लिए 0 № 7

सिंगल-लेयर न्यूरल नेटवर्क्स के लिए नेट पैकेज (जो "कारकों को नहीं समझते") में रूपांतरण कमांड है: class.ind।