首页 > 解决方案 > R - 在包含字符串、NA 和组的数据框中提取最大/最小值行

问题描述

我想找到一种方法来提取数据框中包含 Top 结果(最小值和最大值)的 n 行。问题是这个数据框包含字符串和 NA 以及组。此外,如果顶部结果在同一行中,我仍然需要正好 n 行,因此在同一行中的计数与 1 个结果相同。

  V01_Code V01_Corr  V01_Lag  V02_Code V02_Corr V02_Lag V03_Code V03_Corr V03_Lag V04_Code V04_Corr V04_Lag Group
1      AMI     0.63      L7     <NA>       NA    <NA>     <NA>       NA    <NA>     <NA>       NA    <NA>     B
2      CII    -0.61      L7      CMI    -0.53      L7     <NA>       NA    <NA>     <NA>       NA    <NA>     A
3      AFI     0.51      L7     <NA>       NA    <NA>     <NA>       NA    <NA>     <NA>       NA    <NA>     A
4      AII     0.52      L7      BII     0.62      L4      BMI     0.60      L7      III     0.58      L4     B
5      BII     0.52      L7      IIA     0.74      L6      III     0.51      L7      IMA     0.75      L6     A
6      AII     0.58   L6/L7      BII     0.69      L4      BMI     0.70      L7      IIA     0.57      L4     A
7      IIA     0.58      L6      IMA     0.59      L6      IMI     0.52      L6     <NA>       NA    <NA>     B
8      IMU     0.52      L6     <NA>       NA    <NA>     <NA>       NA    <NA>     <NA>       NA    <NA>     A

我尝试了几个这样的版本:

aggregate(. ~ Group, df, function(x) max(head(sort(x),2),na.rm=T))

但它似乎不起作用!作为输出,我想要一个包含最高和最低值的行(例如这里的 2 行)的数据框。所以在这种情况下,第 5 行中的 0.75 是最高值,第二高在同一行中,然后不计算在内。任何其他行中的第二高将是第 6 行中的 0.7。因此,对于我想要的最大值的前 2 个结果:

   V01_Code V01_Corr  V01_Lag  V02_Code V02_Corr V02_Lag V03_Code V03_Corr V03_Lag V04_Code V04_Corr V04_Lag Group
5      BII     0.52      L7      IIA     0.74      L6      III     0.51      L7      IMA     0.75      L6     A
6      AII     0.58   L6/L7      BII     0.69      L4      BMI     0.70      L7      IIA     0.57      L4     A
1      AMI     0.63      L7     <NA>       NA    <NA>     <NA>       NA    <NA>     <NA>       NA    <NA>     B
4      AII     0.52      L7      BII     0.62      L4      BMI     0.60      L7      III     0.58      L4     B

在这种情况下,n 为 2,因此 2 行包含每个组的最大值。

这是我的数据框

structure(list(V01_Code = c("AMI", "CII", "AFI", "AII", "BII", 
"AII", "IIA", "IMU"), V01_Corr = c(0.63, -0.61, 0.51, 0.52, 0.52, 
0.58, 0.58, 0.52), V01_Lag = c("L7", "L7", "L7", "L7", "L7", 
"L6/L7", "L6", "L6"), V02_Code = c(NA, "CMI", NA, "BII", "IIA", 
"BII", "IMA", NA), V02_Corr = c(NA, -0.53, NA, 0.62, 0.74, 0.69, 
0.59, NA), V02_Lag = c(NA, "L7", NA, "L4", "L6", "L4", "L6", 
NA), V03_Code = c(NA, NA, NA, "BMI", "III", "BMI", "IMI", NA), 
    V03_Corr = c(NA, NA, NA, 0.6, 0.51, 0.7, 0.52, NA), V03_Lag = c(NA, 
    NA, NA, "L7", "L7", "L7", "L6", NA), V04_Code = c(NA, NA, 
    NA, "III", "IMA", "IIA", NA, NA), V04_Corr = c(NA, NA, NA, 
    0.58, 0.75, 0.57, NA, NA), V04_Lag = c(NA, NA, NA, "L4", 
    "L6", "L4", NA, NA), Group = c("B", "A", "A", "B", "A", "A", 
    "B", "A")), row.names = c("1", "2", "3", "4", "5", "6", 
"7", "8"), class = "data.frame")

标签: rsortingaggregateminmax

解决方案


这是一个带有重塑的选项,即创建一个行序列(row_number)列,用 重塑从宽到长pivot_longer,按“组”和“值”列按desc结束顺序排列行,然后filter是第一个“n” unique“rn”-row_number列,ungroup并重新整形为“宽”格式pivot_wider

library(dplyr)
library(tidyr)
df1 %>%
     mutate(rn = row_number()) %>% 
     pivot_longer(cols = ends_with("Corr"), names_to = 'Corr') %>% 
     arrange(Group, desc(value)) %>%
     group_by(Group) %>% 
     filter(rn %in% head(unique(rn), 2)) %>% 
     ungroup %>% 
     select(-rn) %>% 
     pivot_wider(names_from = Corr, values_from = value)

-输出

# A tibble: 4 x 13
  V01_Code V01_Lag V02_Code V02_Lag V03_Code V03_Lag V04_Code V04_Lag Group V04_Corr V02_Corr V03_Corr V01_Corr
  <chr>    <chr>   <chr>    <chr>   <chr>    <chr>   <chr>    <chr>   <chr>    <dbl>    <dbl>    <dbl>    <dbl>
1 BII      L7      IIA      L6      III      L7      IMA      L6      A         0.75     0.74     0.51     0.52
2 AII      L6/L7   BII      L4      BMI      L7      IIA      L4      A         0.57     0.69     0.7      0.58
3 AMI      L7      <NA>     <NA>    <NA>     <NA>    <NA>     <NA>    B        NA       NA       NA        0.63
4 AII      L7      BII      L4      BMI      L7      III      L4      B         0.58     0.62     0.6      0.52

推荐阅读