6

NA がなく、すべて数値である 600 列 (変数) と 10 行の data.frame(sum_clus) がある場合、その行の上位 5 つの変数の列名を示す 5 つの新しい変数を作成するにはどうすればよいですか? ?

たとえば。

max <- apply(sum_clus ,1, max)    
for(ii in 1:10) sum_clus$max[ii] <- colnames(sum_clus)[which(sum_clus[ii , ] 
== sum_clus[ii, sum_clus[ii,] == max[ii]])]

上記のコードは、各行の最大変数の列名を与える変数 sum_clus$max を作成するのに役立ちました。同様に、上位 5 つの変数の列名を示す 5 つの変数を取得するにはどうすればよいでしょうか? sum_clus$max、sum_clus$second_but_max など。

前もって感謝します!

4

2 に答える 2

5

1つのオプションは、使用order()してから、それを使用して列名をサブセット化することです。次に例を示します。

set.seed(1)
df <- data.frame(matrix(runif(600*10), ncol = 600))

foo <- function(x, names) {
  ord <- order(x, decreasing = TRUE)[1:5]
  names[ord]
}

nams <- colnames(df)
apply(df, 1, foo, names = nams)

生産

> apply(df, 1, foo, names = nams)
     [,1]   [,2]   [,3]   [,4]   [,5]   [,6]   [,7]   [,8]   [,9]   [,10] 
[1,] "X369" "X321" "X348" "X415" "X169" "X258" "X55"  "X182" "X99"  "X78" 
[2,] "X42"  "X295" "X563" "X173" "X377" "X31"  "X246" "X353" "X259" "X384"
[3,] "X98"  "X440" "X371" "X207" "X429" "X292" "X433" "X437" "X123" "X558"
[4,] "X13"  "X193" "X396" "X78"  "X543" "X228" "X211" "X2"   "X583" "X508"
[5,] "X35"  "X364" "X249" "X33"  "X388" "X405" "X458" "X252" "X569" "X456"

これが機能することを確認します。

> names(sort(unlist(df[1,, drop = TRUE]), decreasing = TRUE)[1:5])
[1] "X369" "X42"  "X98"  "X13"  "X35" 
> names(sort(unlist(df[2,, drop = TRUE]), decreasing = TRUE)[1:5])
[1] "X321" "X295" "X440" "X193" "X364"

大丈夫そうです。

于 2013-05-14T19:37:00.967 に答える
3

(i) の代わりにループを使用した同様のソリューションを次にapply示します。(ii)rankの代わりにorder.

set.seed(1)
n_i   = 10
n_ii  = 600
n_top = 5
df <- data.frame(matrix(runif(n_ii*n_i), ncol = n_ii))

out <- matrix("",n_top,n_i)
for (i in 1:n_i){
    colranks <- rank(df[i,])
    out[,i] <- names(sort(colranks)[n_ii:(n_ii-(n_top-1))])
}
#      [,1]   [,2]   [,3]   [,4]   [,5]   [,6]   [,7]   [,8]   [,9]   [,10] 
# [1,] "X369" "X321" "X348" "X415" "X169" "X258" "X55"  "X182" "X99"  "X78" 
# [2,] "X42"  "X295" "X563" "X173" "X377" "X31"  "X246" "X353" "X259" "X384"
# [3,] "X98"  "X440" "X371" "X207" "X429" "X292" "X433" "X437" "X123" "X558"
# [4,] "X13"  "X193" "X396" "X78"  "X543" "X228" "X211" "X2"   "X583" "X508"
# [5,] "X35"  "X364" "X249" "X33"  "X388" "X405" "X458" "X252" "X569" "X456"

とのワンライナーアナログapply

apply(df,1,function(x)names(sort(rank(x))))[600:596,]
于 2013-05-14T19:37:39.337 に答える