【问题标题】:Find column indices for max values of each row查找每行最大值的列索引
【发布时间】:2020-10-14 00:55:26
【问题描述】:

我是 R 编程新手,我有以下数据框:

 A B C D E
1 3 0 4 5 0
2 0 0 5 1 0
3 2 1 2 0 3

我想获得一个新的数据框,其中包含每行的 n 个最大值的索引,例如:如果我想要每行中 3 个最大值的列索引 (n=3),我想要我的新数据框变成这样:

  F G H
1 1 3 4
2 1 3 4
3 1 3 5

因此,此数据帧的第一行包含原始数据帧中第 1 行的 3 个最大值的列索引。以此类推。

我最初的想法是用 which.max 编写一个循环,但这似乎太长且无效。有人有更好的主意吗?

【问题讨论】:

    标签: r dataframe max


    【解决方案1】:

    我们可以使用apply

    t(apply(df1, 1, function(x) sort(head(seq_along(x)[order(-x)], 3))))
    #   [,1] [,2] [,3]
    #1    1    3    4
    #2    1    3    4
    #3    1    3    5
    

    或使用tidyverse

    library(dplyr)
    library(tidyr)
    df1 %>%
       mutate(rn = row_number()) %>% 
       pivot_longer(cols = -rn) %>% 
       group_by(rn) %>% 
       mutate(ind = row_number()) %>% 
       arrange(rn, desc(value)) %>% 
       slice(n = 1:3)  %>% 
       select(-name, -value) %>% 
       arrange(rn, ind) %>%
       mutate(nm1 = c("F", "G", "H")) %>% 
       ungroup %>% 
       pivot_wider(names_from = nm1, values_from = ind)
    

    数据

    df1 <- structure(list(A = c(3L, 0L, 2L), B = c(0L, 0L, 1L), C = c(4L, 
    5L, 2L), D = c(5L, 1L, 0L), E = c(0L, 0L, 3L)), class = "data.frame",
    row.names = c("1", 
    "2", "3"))
    

    【讨论】:

    • 感谢您的快速回复!有用!我见过 apply、lapply、mapply 等被大量使用。它在实际领域似乎非常有用。如何轻松学习这些功能?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-10-27
    • 2012-07-16
    • 2015-07-07
    相关资源
    最近更新 更多