2012-04-24 11 views
10

उदाहरण के लिए दिए गए:हो रही स्तंभ नाम जो एक सरणी के भीतर एक अलग अधिकतम मूल्य पकड़े एक मैट्रिक्स की एक पंक्ति के भीतर एक अधिकतम मूल्य रखती है

dim1 <- c("P","PO","C","T") 
dim2 <- c("LL","RR","R","Y") 
dim3 <- c("Jerry1", "Jerry2", "Jerry3") 
Q <- array(1:48, c(4, 4, 3), dimnames = list(dim1, dim2, dim3)) 

मैं इस सरणी के भीतर संदर्भ लेना चाहते हैं, मैट्रिक्स अधिकतम है dim3 मान (तीसरी पंक्ति, चौथा कॉलम) स्थान पर।

उस मैट्रिक्स की पहचान करने पर, मैं कॉलम नाम वापस करना चाहता हूं जिसमें मैट्रिक्स (तीसरी पंक्ति, पहला स्तंभ) (अधिकतम पंक्ति, 3 कॉलम) सीमा के भीतर अधिकतम मान है।

तो मुझे क्या उम्मीद है कि जेरी 3 को संदर्भित किया जाएगा क्योंकि नंबर 47 अपनी तीसरी पंक्ति, चौथा कॉलम में और फिर जेरी 3 में संग्रहीत है, मैं चाहता हूं कि पंक्ति 3 में अधिकतम संख्या संदर्भित करे जो संदर्भित करे 43 हो, और आखिरकार, मुझे जो चाहिए वह लौटा (केवल मुझे आवश्यक मूल्य) कॉलम नाम है जो "आर" होगा।

मुझे यह जानने की ज़रूरत है कि "आर" प्राप्त करें और इसे एक चर के लिए असाइन करें, यानी "column_ref", जैसे कॉलम_फ < - "आर"।

कृपया मदद करें।

+0

यह कई कदम हैं। आपने कितने कदमों का प्रयास किया है, आपने किस कोड का प्रयास किया है, और उन्होंने कैसे काम नहीं किया है? – joran

+0

हाय जोरन, मैं आर के लिए नया हूं, लेकिन मैंने जो कोशिश की है (कम से कम समझने के लिए) इस लिंक पर है - https://stat.ethz.ch/pipermail/r-help/2006- मार्च/101026.html। –

उत्तर

14

यह यह करना चाहिए - अगर मैं सही ढंग से समझ:

Q <- array(1:48, c(4,4,3), dimnames=list(
    c("P","PO","C","T"), c("LL","RR","R","Y"), c("Jerry1", "Jerry2", "Jerry3"))) 

column_ref <- names(which.max(Q[3,1:3, which.max(Q[3,4,])]))[1] # "R" 

कुछ स्पष्टीकरण:

which.max(Q[3,4,]) # return the index of the "Jerry3" slice (3) 
which.max(Q[3,1:3, 3]) # returns the index of the "R" column (3) 

... और फिर names रिटर्न सूचकांक ("आर") का नाम है।

+0

धन्यवाद, टॉमी। वह वास्तव में काम करता है। यह मुझे समझने में बहुत मदद करता है कि जब मैं अपनी समस्या के आगे समाधान देखता हूं तो इसे कैसे बनाया जाए। तब मुझे सामान्य अवधारणा मिलती है। मैं बहुत आभारी हूँ। धन्यवाद। –

0

इस पोस्ट ने मुझे डेटा.फ्रेम सामान्य समस्या हल करने में मदद की।
मैंने समूहों के लिए उपाय दोहराए हैं, G1G2

> str(df) 
'data.frame': 6 obs. of 15 variables: 
$ G1  : num 0 0 2 2 8 8 
$ G2  : logi FALSE TRUE FALSE TRUE FALSE TRUE 
$ e.10.100 : num 26.41 -11.71 27.78 3.17 26.07 ... 
$ e.10.250 : num 27.27 -12.79 29.16 3.19 26.91 ... 
$ e.20.100 : num 29.96 -12.19 26.19 3.44 27.32 ... 
$ e.20.100d: num 26.42 -13.16 28.26 4.18 25.43 ... 
$ e.20.200 : num 24.244 -18.364 29.047 0.553 25.851 ... 
$ e.20.50 : num 26.55 -13.28 29.65 4.34 27.26 ... 
$ e.20.500 : num 27.94 -13.92 27.59 2.47 25.54 ... 
$ e.20.500d: num 24.4 -15.63 26.78 4.86 25.39 ... 
$ e.30.100d: num 26.543 -15.698 31.849 0.572 29.484 ... 
$ e.30.250 : num 26.776 -16.532 28.961 0.813 25.407 ... 
$ e.50.100 : num 25.995 -14.249 28.697 0.803 27.852 ... 
$ e.50.100d: num 26.1 -12.7 27.1 2.5 27.4 ... 
$ e.50.500 : num 28.78 -9.39 25.77 2.73 23.73 .. 

मुझे यह जानने की जरूरत है कि कौन सा उपाय (कॉलम) सर्वोत्तम (अधिकतम) परिणाम है। और मुझे समूह कॉलम पर विचार करने की आवश्यकता है।
मैं इस समारोह

apply(df[colIni:colFim], 1, function(x) colnames(df)[which.max(x)+(colIni-1)] 
#colIni: first column to consider; colFim: last column to consider 

साथ समाप्त हो गया स्तंभ नाम होने के बाद, एक और छोटे समारोह इसी तरह की समस्याओं, उस स्तंभ और अधिकतम वापसी हल करने के लिए अधिकतम मूल्य

apply(dfm,1,function(x) x[x[1]]) 

और समारोह पाने के लिए मूल्य

mxCol=function(df, colIni, colFim){ #201609 
    if(missing(colIni)) colIni=1 
    if(missing(colFim)) colFim=ncol(df) 
    if(colIni>=colFim) { print('colIni>=ColFim'); return(NULL)} 
    dfm=cbind(mxCol=apply(df[colIni:colFim], 1, function(x) colnames(df)[which.max(x)+(colIni-1)]) 
      ,df) 
    dfm=cbind(mxVal=as.numeric(apply(dfm,1,function(x) x[x[1]])) 
      ,dfm) 
    return(dfm) 
} 

इस मामले में,

> mxCol(df,3)[1:11] 
    mxVal  mxCol G1 G2 e.10.100 e.10.250 e.20.100 e.20.100d e.20.200 e.20.50 e.20.500 
1 29.958 e.20.100 0 FALSE 26.408 27.268 29.958 26.418 24.244 26.553 27.942 
2 -9.395 e.50.500 0 TRUE -11.708 -12.789 -12.189 -13.162 -18.364 -13.284 -13.923 
3 31.849 e.30.100d 2 FALSE 27.782 29.158 26.190 28.257 29.047 29.650 27.586 
4 4.862 e.20.500d 2 TRUE 3.175 3.190 3.439  4.182 0.553 4.337 2.467 
5 29.484 e.30.100d 8 FALSE 26.069 26.909 27.319 25.430 25.851 27.262 25.535 
6 -9.962 e.30.250 8 TRUE -11.362 -12.432 -15.960 -11.760 -12.832 -12.771 -12.810 
संबंधित मुद्दे