2012-04-24 47 views
10

Ví dụ đưa ra:Bắt tên cột mà giữ một giá trị tối đa trong một hàng của một ma trận giữ một giá trị tối đa riêng biệt trong một mảng

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)) 

Tôi muốn tham khảo trong mảng này, ma trận có tối đa giá trị dim3 tại vị trí (hàng thứ 3, cột thứ 4).

Khi xác định ma trận đó, tôi muốn trả về tên cột có giá trị lớn nhất trong phạm vi của ma trận (hàng thứ 3, cột thứ nhất) đến (hàng 3, cột thứ 3). Vì vậy, những gì tôi hy vọng sẽ xảy ra là Jerry3 được tham chiếu vì số 47 được lưu trữ trong hàng thứ 3, cột thứ 4, và sau đó trong Jerry3, tôi muốn số tối đa trong hàng 3 để được tham chiếu mà sẽ là 43, và cuối cùng, những gì tôi cần trả về (giá trị duy nhất tôi cần) là tên cột sẽ là "R".

Đó là những gì tôi cần biết cách thực hiện, nhận được "R" đó và gán nó cho biến, tức là "column_ref", chẳng hạn như cột_ref < - "R".

Vui lòng giúp đỡ.

+0

Đó là một vài bước. Bạn đã thử bao nhiêu bước trong số đó, bạn đã thử mã nào và họ chưa làm việc như thế nào? – joran

+0

Hi Joran, tôi mới đến R, nhưng những gì tôi đã cố gắng (ít nhất là để hiểu) là tại liên kết này - https://stat.ethz.ch/pipermail/r-help/2006-March/101026.html. –

Trả lời

14

này nên làm điều đó - nếu tôi hiểu đúng:

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" 

Một số giải thích:

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) 

... và sau đó names trả về tên của chỉ số ("R").

+0

Cảm ơn, Tommy. Điều đó thực sự hiệu quả. Nó cũng giúp tôi rất nhiều để hiểu làm thế nào để xây dựng nó khi tôi nhìn thấy giải pháp bên cạnh vấn đề của tôi. Sau đó, tôi nhận được khái niệm chung. Tôi rât cảm kich. Cảm ơn bạn. –

0

Bài đăng này đã giúp tôi giải quyết vấn đề chung về data.frame.
Tôi đã lặp lại các biện pháp cho các nhóm, G1 e G2.

> 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 .. 

Tôi cần biết biện pháp nào (cột) có kết quả tốt nhất (tối đa). Và tôi cần phải cân nhắc các cột nhóm.
tôi đã kết thúc với chức năng này

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

Sau khi tên cột, một chức năng nhỏ để có được giá trị tối đa

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

Và chức năng để giải quyết vấn đề tương tự, mà trả lại cột và tối đa giá trị

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) 
} 

Trong trường hợp này,

> 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 
Các vấn đề liên quan