2017-08-10 47 views
0

對於下面數據幀輸入其相應的列名稱:檢索最大下降順序值與每每一行

data <- data.frame(A = c(19,2,3,22), B = c(1,20,12,15) , C = c(10,11,19,0), D = c(0,13,8,2), E = c(75,21,4,80)) 

    A B C D E 
1 19 1 10 0 75 
2 2 20 11 13 21 
3 3 12 19 8 4 
4 22 15 0 2 80 

我當前的代碼檢索每行的行如下的前三個最大輸出:

t(apply(data, 1, function(x) head(sort(x, decreasing = TRUE, na.last = NA), 3))) 

     [,1] [,2] [,3] 

    [1,] 75 19 10 
    [2,] 21 20 13 
    [3,] 19 12 8 
    [4,] 80 22 15 

那麼因爲我需要下面的輸出檢索名稱標籤與每個最大值保存在旁邊的記者「max_value」N:

[,1] [,2] [,3] [,4] [,5] [,6] 
[1,] 75 E 19 A 10  C 
[2,] 21 E 20 B 13  D 
[3,] 19 C 12 B 8  D 
[4,] 80 E 22 A 15  B 

回答

1

按照你的方法,你可以重做apply功能也得到了名字,然後就綁定以交替的方式兩個,即

m1 <- t(apply(a, 1, function(x) head(sort(x, decreasing = TRUE, na.last = NA), 3))) 
m2 <- t(apply(a, 1, function(x) names(head(sort(x, decreasing = TRUE, na.last = NA), 3)))) 

matrix(c(rbind(m1, m2)), nrow = nrow(data)) 

其中給出,

[,1] [,2] [,3] [,4] [,5] [,6] 
[1,] "75" "E" "19" "A" "10" "C" 
[2,] "21" "E" "20" "B" "13" "D" 
[3,] "19" "C" "12" "B" "8" "D" 
[4,] "80" "E" "22" "A" "15" "B" 
+0

十分感謝很多 – jean

+0

時也有類似的聲明/功能重複,我們可以mapply使用(函數(i)apply(data,1,function(x)i(head(sort(x,TRUE),3))),c(function(m) m),' '矩陣(t(a),ncol = 6,byrow = T)'會給我們與上面相同的結果 – Onyambu

+0

@Onyambu謝謝你提到它。我知道。我只是這樣做,遵循OP結構/語法。我們也可以避免「應用(df,1,...)」(這對數據幀來說是非常糟糕的),這將是理想的解決方案。只要我有一些時間,我會盡快更新矢量化的替代方案 – Sotos

0

以下是使用mutate_allmap2的方法。

我們建立索引的矩陣,然後用map2分別建立我們的行加入他們背後到底:

library(dplyr) 
library(purr) 
data %>% t %>% as.data.frame %>% 
    map2(mutate_all(.,order,decreasing = TRUE),~ (.x %>% rbind(names(data)))[,.y] %>% c) %>% 
    bind_cols %>% head(3*2) %>% t 

# [,1] [,2] [,3] [,4] [,5] [,6] 
# V1 "75" "E" "19" "A" "10" "C" 
# V2 "21" "E" "20" "B" "13" "D" 
# V3 "19" "C" "12" "B" "8" "D" 
# V4 "80" "E" "22" "A" "15" "B"