2013-11-14 20 views
8

युक्त कई स्तंभों में सबसे अधिक मूल्यवान मूल्यों को कैसे ढूंढें मैं अभी भी आर के लिए अपेक्षाकृत नया हूं, इसलिए यदि मेरा प्रश्न बहुत बुनियादी लगता है तो अग्रिम क्षमा करें।कारक

मैं कई कारक चर, जो एक ही श्रेणियां हैं युक्त एक डेटा सेट:

मेरे समस्या इस प्रकार है। मुझे श्रेणी खोजने की ज़रूरत है, जो कारक चर के पार प्रत्येक अवलोकन के लिए अक्सर होता है। संबंधों के मामले में मनमाना मूल्य चुना जा सकता है, हालांकि यह बहुत अच्छा होगा अगर मैं इसके ऊपर अधिक नियंत्रण रख सकूं।

मेरे डेटा सेट में सौ से अधिक कारक हैं।

id <- 1:3 
var1 <- c("red","yellow","green") 
var2 <- c("red","yellow","green") 
var3 <- c("yellow","orange","green") 
var4 <- c("orange","green","yellow") 
df <- data.frame(cbind(id, var1, var2, var3, var4)) 


> df 
    id var1 var2 var3 var4 
1 1 red red yellow orange 
2 2 yellow yellow orange green 
3 3 green green green yellow 

समाधान डेटा सीमा के भीतर एक चर होना चाहिए, उदाहरण के var5 है, जो प्रत्येक पंक्ति के लिए सबसे लगातार श्रेणी में शामिल है के लिए: हालांकि, संरचना ऐसा ही कुछ है। यह एक कारक या एक अंकीय वेक्टर

इस मामले में (मामले में डेटा संख्यात्मक वैक्टर करने के लिए पहले परिवर्तित किया जा करने की जरूरत है) हो सकता है, मैं इस समाधान करना चाहते हैं:

> df$var5 
[1] "red" "yellow" "green" 

कोई सलाह हो जाएगा बहुत सराहना की! अग्रिम में धन्यवाद!

उत्तर

13

कुछ की तरह:

apply(df,1,function(x) names(which.max(table(x)))) 
[1] "red" "yellow" "green" 

मामले में वहाँ एक टाई, which.max पहले अधिकतम मूल्य लेता है। which.max मदद पृष्ठ से:

स्थान निर्धारित करता है, जैसे कि, (प्रथम) न्यूनतम या एक अंकीय वेक्टर की अधिकतम के सूचकांक।

पूर्व:

var4 <- c("yellow","green","yellow") 
df <- data.frame(cbind(id, var1, var2, var3, var4)) 

> df 
    id var1 var2 var3 var4 
1 1 red red yellow yellow 
2 2 yellow yellow orange green 
3 3 green green green yellow 

apply(df,1,function(x) names(which.max(table(x)))) 
[1] "red" "yellow" "green" 
+0

अच्छा काम, मेरा से क्लीनर। मुझे एहसास नहीं हुआ था कि मैं सभी रूपांतरणों को छोड़ सकता हूं, अनदेखा कर सकता हूं, आदि –

+0

इस समाधान के लिए आपको बहुत बहुत धन्यवाद। मैंने बस इसे अपने डेटा पर आज़माया और यह पूरी तरह से काम करता है! क्या आप कृपया मेरे लिए स्पष्टीकरण दे सकते हैं, यह तरीका संबंधों को कैसे हल करता है? धन्यवाद! – ZMacarozzi

+0

मैंने टाई के साथ केसेट करने के लिए अपना जवाब संपादित किया। सहायता पृष्ठों का उपयोग कैसे करें सीखना एक अच्छी आदत है। मुझे खुशी है कि मेरा समाधान आपके लिए काम करता है। – Chargaff

0

अपने डेटा काफी बड़ा आप data.table पैकेज के उपयोग पर विचार करना चाह सकते हैं है।

# Generate the data 
nrow <- 10^5 
id <- 1:nrow 
colors <- c("red","yellow","green") 
var1 <- sample(colors, nrow, replace = TRUE) 
var2 <- sample(colors, nrow, replace = TRUE) 
var3 <- sample(colors, nrow, replace = TRUE) 
var4 <- sample(colors, nrow, replace = TRUE) 

Mode <- function(x) { 
    ux <- unique(x) 
    ux[which.max(tabulate(match(x, ux)))] 
} 

Chargaff के समाधान सरल है और कुछ मामलों में अच्छी तरह से काम करता है। आप data.table का उपयोग कर एक छोटा प्रदर्शन सुधार (~ 20%) प्राप्त कर सकते हैं।

df <- data.frame(cbind(id, var1, var2, var3, var4)) 
system.time(apply(df, 1, Mode)) 
# user system elapsed 
# 1.242 0.018 1.264 

library(data.table) 
dt <- data.table(cbind(id, var1, var2, var3, var4)) 
system.time(melt(dt, measure = patterns('var'))[, Mode(value1), by = id]) 
# user system elapsed 
# 1.020 0.012 1.034 
संबंधित मुद्दे