2013-05-14 61 views
5

Nếu tôi có một data.frame (sum_clus) với 600 cột (biến) và 10 hàng không có NA và tất cả đều là giá trị số, làm cách nào tôi có thể tạo 5 biến mới cung cấp cho tôi tên cột của 5 biến hàng đầu trong hàng đó?Cách lấy tên cột của biến có 10 giá trị cao nhất hàng đầu?

Ví dụ:

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

Mã trên đây đã giúp tôi tạo biến sum_clus $ max mang lại cho tôi tên cột của biến tối đa trong mỗi hàng. Tương tự, làm cách nào tôi có thể nhận được 5 biến số như vậy cung cấp cho tôi tên cột của 5 biến hàng đầu? sum_clus $ max, sum_clus $ second_but_max, v.v ..

Cảm ơn bạn trước!

+1

Ông có thể cung cấp một mẫu? Có lẽ 'sum_clus [1: 10,1: 10]' hay cái gì đó ...? – Frank

Trả lời

3

Đây là giải pháp tương tự, sử dụng (i) vòng lặp thay vì apply; và (ii) rank thay vì 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" 

Các analogue một liner với apply

apply(df,1,function(x)names(sort(rank(x))))[600:596,] 
+0

vòng lặp của bạn ở đâu? –

+0

@RicardoSaporta Tôi đã ghi đè giải pháp của mình bằng một câu trả lời hoàn chỉnh ngay bây giờ. – Frank

+2

Tôi thích nó tốt hơn mà không có vòng lặp;) –

5

Một lựa chọn là sử dụng order() và sau đó sử dụng để tập hợp con các tên cột, ví dụ:

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) 

Sản xuất

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

Kiểm tra công trình này:

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

vẻ OK .

Các vấn đề liên quan