2017-08-10 44 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"