दिलचस्प पोस्ट
अप्रबंधित C ++ क्लाइंट के लिए WCF सेवा बनाएँ सी ++ 11 के लिए अनुक्रम-ज़िप फ़ंक्शन? कैसे एमएलसी में नियंत्रक में DropDownList चयनित मूल्य प्राप्त करने के लिए Npm संकुल को कहाँ स्थापित करता है? फिर भी एक और क्रॉस-डोमेन आईफ्रेम का आकार बदलता है क्यू एंड ए जावास्क्रिप्ट || ऑपरेटर NSString के बोल्ड भाग का कोई भी तरीका? कैसे PHP समानता (== डबल बराबर) और पहचान (=== ट्रिपल बराबर) तुलना ऑपरेटर भिन्न है? MySQL कंडीशनल सम्मिलित करें Android में मेरी गतिविधि से रिंगटोन कैसे सेट करें? अगर फ़ाइल / निर्देशिका Node.js में मौजूद है, तो समन्वयित करें टीडीडी के लिए जावास्क्रिप्ट इकाई परीक्षण उपकरण मैं गिट में फ़ाइलों को एक पूर्व अनुच्छेद के पथ में कैसे जोड़ूं? जेएसएफ घटक बीन की संपत्ति के बिना बाध्यकारी AngularJs – रूट परिवर्तन ईवेंट को रद्द करें

प्रत्येक कारक स्तर के लिए 1/0 सूचक चर के संग्रह में एक आर कारक को स्वचालित रूप से विस्तारित करना

मेरे पास एक आर डेटा फ्रेम है जिसमें एक कारक है जिसे मैं "विस्तार" करना चाहता हूं ताकि प्रत्येक कारक स्तर के लिए, एक नया डेटा फ्रेम में एक संबद्ध स्तंभ हो, जिसमें 1/0 सूचक होता है उदाहरण के लिए, मान लीजिए:

df.original <-data.frame(eggs = c("foo", "foo", "bar", "bar"), ham = c(1,2,3,4)) 

मुझे चाहिए:

 df.desired <- data.frame(foo = c(1,1,0,0), bar=c(0,0,1,1), ham=c(1,2,3,4)) 

क्योंकि कुछ विश्लेषण के लिए जिसके लिए आपको पूरी तरह से न्यूमेरिक डेटा फ्रेम (उदाहरण के लिए, मुख्य घटक विश्लेषण) की आवश्यकता है, मैंने सोचा था कि इस सुविधा को बनाया जा सकता है। ऐसा करने के लिए फ़ंक्शन लिखना बहुत मुश्किल नहीं होना चाहिए, लेकिन मुझे कुछ पता चल सकता है स्तंभ नामों से संबंधित चुनौतियों और अगर कुछ पहले से ही मौजूद है, तो मैं इसका उपयोग करना चाहता हूं।

वेब के समाधान से एकत्रित समाधान "प्रत्येक कारक स्तर के लिए 1/0 सूचक चर के संग्रह में एक आर कारक को स्वचालित रूप से विस्तारित करना"

model.matrix उपयोग करें। model.matrix फ़ंक्शन:

 model.matrix( ~ Species - 1, data=iris ) 

यदि आपका डेटा फ़्रेम केवल कारकों से बना है (या आप वेरिएबल्स के एक सबसेट पर काम कर रहे हैं जो सभी कारक हैं), तो आप acm.disjonctif ade4 पैकेज से acm.disjonctif फ़ंक्शन का उपयोग कर सकते हैं:

 R> library(ade4) R> df <-data.frame(eggs = c("foo", "foo", "bar", "bar"), ham = c("red","blue","green","red")) R> acm.disjonctif(df) eggs.bar eggs.foo ham.blue ham.green ham.red 1 0 1 0 0 1 2 0 1 1 0 0 3 1 0 0 1 0 4 1 0 0 0 1 

बिल्कुल नहीं जो आप वर्णन कर रहे हैं, लेकिन यह भी उपयोगी हो सकता है …

reshape2 पैकेज का उपयोग करने का एक त्वरित तरीका:

 require(reshape2) > dcast(df.original, ham ~ eggs, length) Using ham as value column: use value_var to override. ham bar foo 1 1 0 1 2 2 0 1 3 3 1 0 4 4 1 0 

ध्यान दें कि यह आपके द्वारा इच्छित कॉलम नामों को ठीक से तैयार करता है।

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

 > with(df.original, data.frame(model.matrix(~eggs+0), ham)) eggsbar eggsfoo ham 1 0 1 1 2 0 1 2 3 1 0 3 4 1 0 4 

nnet पैकेज से देर से प्रवेश class.ind

 library(nnet) with(df.original, data.frame(class.ind(eggs), ham)) bar foo ham 1 0 1 1 2 0 1 2 3 1 0 3 4 1 0 4 

बस इस पुराने धागे में आया और मैंने सोचा कि मैं एक फ़ंक्शन जोड़ूंगा जो एडे 4 का उपयोग करने के लिए कारकों और / या न्यूमेरिक डेटा से डेटाफ्रेम लेता है और डमी कोड के रूप में कारकों के साथ डेटाफ्रेम देता है।

 dummy <- function(df) { NUM <- function(dataframe)dataframe[,sapply(dataframe,is.numeric)] FAC <- function(dataframe)dataframe[,sapply(dataframe,is.factor)] require(ade4) if (is.null(ncol(NUM(df)))) { DF <- data.frame(NUM(df), acm.disjonctif(FAC(df))) names(DF)[1] <- colnames(df)[which(sapply(df, is.numeric))] } else { DF <- data.frame(NUM(df), acm.disjonctif(FAC(df))) } return(DF) } 

चलो यह कोशिश करते हैं।

 df <-data.frame(eggs = c("foo", "foo", "bar", "bar"), ham = c("red","blue","green","red"), x=rnorm(4)) dummy(df) df2 <-data.frame(eggs = c("foo", "foo", "bar", "bar"), ham = c("red","blue","green","red")) dummy(df2) 

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

 # Function to explode factors that are considered to be categorical, # ie, they do not have too many levels. # - data: The data.frame in which categorical variables will be exploded. # - values: The exploded values for the value being unequal and equal to a level. # - max_factor_level_fraction: Maximum number of levels as a fraction of column length. Set to 1 to explode all factors. # Inspired by the acm.disjonctif function in the ade4 package. explode_factors <- function(data, values = c(-0.8, 0.8), max_factor_level_fraction = 0.2) { exploders <- colnames(data)[sapply(data, function(col){ is.factor(col) && nlevels(col) <= max_factor_level_fraction * length(col) })] if (length(exploders) > 0) { exploded <- lapply(exploders, function(exp){ col <- data[, exp] n <- length(col) dummies <- matrix(values[1], n, length(levels(col))) dummies[(1:n) + n * (unclass(col) - 1)] <- values[2] colnames(dummies) <- paste(exp, levels(col), sep = '_') dummies }) # Only keep numeric data. data <- data[sapply(data, is.numeric)] # Add exploded values. data <- cbind(data, exploded) } return(data) } 

यह करने के लिए यहां एक अधिक स्पष्ट तरीका है मैं डमी बूलियन वैरिएबल बनाने के लिए मॉडल। मेट्रिक्स का उपयोग करता हूं और फिर उसे मूल डेटाफ्रेम में वापस मर्ज करता हूं।

 df.original <-data.frame(eggs = c("foo", "foo", "bar", "bar"), ham = c(1,2,3,4)) df.original # eggs ham # 1 foo 1 # 2 foo 2 # 3 bar 3 # 4 bar 4 # Create the dummy boolean variables using the model.matrix() function. > mm <- model.matrix(~eggs-1, df.original) > mm # eggsbar eggsfoo # 1 0 1 # 2 0 1 # 3 1 0 # 4 1 0 # attr(,"assign") # [1] 1 1 # attr(,"contrasts") # attr(,"contrasts")$eggs # [1] "contr.treatment" # Remove the "eggs" prefix from the column names as the OP desired. colnames(mm) <- gsub("eggs","",colnames(mm)) mm # bar foo # 1 0 1 # 2 0 1 # 3 1 0 # 4 1 0 # attr(,"assign") # [1] 1 1 # attr(,"contrasts") # attr(,"contrasts")$eggs # [1] "contr.treatment" # Combine the matrix back with the original dataframe. result <- cbind(df.original, mm) result # eggs ham bar foo # 1 foo 1 0 1 # 2 foo 2 0 1 # 3 bar 3 1 0 # 4 bar 4 1 0 # At this point, you can select out the columns that you want.