我有一个数据,我想找出哪一列具有最大值,并输出该列名。一个问题是,如果没有最大值(例如,所有数字都相等),则返回all_equal注释,或者如果两列与第三列相比具有相等的最大值,则输出这两个列名。
以下是示例数据
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中,A、B and C列中都有值。我的目的是找出该组中哪一列的值最大,并将该列名输出到名为col_name的新列中。
如果在gr=2中所有值都相等,则输出为all_equal
如果其中两列与第三列相比具有最大值,则将列名A&C输出到col_name。
我意识到在没有gather的情况下构建管道可能很困难
所以我试过了;
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格式输出这些相等的列名
预期的输出将是
> 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提前谢谢你!
发布于 2018-08-10 09:48:12
类似于akrun的回答
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
https://stackoverflow.com/questions/51776426
复制相似问题