首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何输出具有最大值的列

如何输出具有最大值的列
EN

Stack Overflow用户
提问于 2018-08-10 06:12:23
回答 2查看 319关注 0票数 5

我有一个数据,我想找出哪一列具有最大值,并输出该列名。一个问题是,如果没有最大值(例如,所有数字都相等),则返回all_equal注释,或者如果两列与第三列相比具有相等的最大值,则输出这两个列名。

以下是示例数据

代码语言:javascript
复制
test <- data.frame(A=c(5,NA,NA,1,NA,NA,3,NA,NA),B=c(NA,2,NA,NA,1,NA,NA,1,NA),C=c(NA,NA,1,NA,NA,1,NA,NA,3),gr=gl(3,3))

   A  B  C gr
1  5 NA NA  1
2 NA  2 NA  1
3 NA NA  1  1
4  1 NA NA  2
5 NA  1 NA  2
6 NA NA  1  2
7  3 NA NA  3
8 NA  1 NA  3
9 NA NA  3  3

在每个gr中,AB and C列中都有值。我的目的是找出该组中哪一列的值最大,并将该列名输出到名为col_name的新列中。

如果在gr=2中所有值都相等,则输出为all_equal

如果其中两列与第三列相比具有最大值,则将列名A&C输出到col_name

我意识到在没有gather的情况下构建管道可能很困难

所以我试过了;

代码语言:javascript
复制
library(dplyr)
test%>%
  group_by(gr)%>%

  gather(variable, value, -gr) %>%
  arrange(gr)%>%
  mutate(col_name=variable[which.max(value)])

# A tibble: 18 x 4
# Groups:   gr [2]
   r    variable value col_name
   <fct> <chr>    <dbl> <chr>   
 1 1     A            5 A       
 2 1     A           NA A       
 3 1     A           NA A       
 4 1     B           NA A       
 5 1     B            2 A       
 6 1     B           NA A       
 7 1     C           NA A       
 8 1     C           NA A       
 9 1     C            1 A       
10 2     A            1 A       
11 2     A           NA A       
12 2     A           NA A       
13 2     B           NA A       
14 2     B            1 A       
15 2     B           NA A       
16 2     C           NA A       
17 2     C           NA A       
18 2     C            1 A 

我在这里遇到的问题是,如果A、B和C列中的所有最大值都相等,如何输出all_equal注释

如果2列的最大值等于(gr=3中的A和C),则以col_name中的A&C格式输出这些相等的列名

预期的输出将是

代码语言:javascript
复制
> test
       A  B  C gr  col_name
    1  5 NA NA  1     A
    2 NA  2 NA  1     A
    3 NA NA  1  1     A
    4  1 NA NA  2  all_equal
    5 NA  1 NA  2  all_equal 
    6 NA NA  1  2  all_equal
    7  3 NA NA  3  A&C
    8 NA  1 NA  3  A&C 
    9 NA NA  3  3  A&C

提前谢谢你!

EN

Stack Overflow用户

发布于 2018-08-10 09:48:12

类似于akrun的回答

代码语言:javascript
复制
library(tidyverse)

test <- data_frame(A=c(5,NA,NA,1,NA,NA,3,NA,NA),B=c(NA,2,NA,NA,1,NA,NA,1,NA),C=c(NA,NA,1,NA,NA,1,NA,NA,3),gr=gl(3,3))


test %>% gather(key, value, -gr, na.rm = TRUE) %>% 
  group_by(gr) %>% 
  arrange(gr) %>%
  mutate(col_name = if_else(length(which(value == max(value))) == length(unique(key)),
                     "all_equal",
                     paste(flatten(.[which(value == max(value)), "key"]), collapse = "&"))) %>% 
  spread(key, value)
#> # A tibble: 3 x 5
#> # Groups:   gr [3]
#>   gr    col_name      A     B     C
#>   <fct> <chr>     <dbl> <dbl> <dbl>
#> 1 1     A             5     2     1
#> 2 2     all_equal     1     1     1
#> 3 3     A&C           3     1     3

reprex package创建于2018-08-09 (v0.2.0)。

这还将压缩数据帧以删除所有额外的NA

票数 2
EN
查看全部 2 条回答
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/51776426

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档