【问题标题】:R - Extracting rows of max/min values in a dataframe containing strings, NA and groupsR - 在包含字符串、NA 和组的数据框中提取最大/最小值行
【发布时间】:2021-08-29 21:23:39
【问题描述】:

我想找到一种方法来提取数据框中包含 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")

【问题讨论】:

  • 哪一列的最大值?不确定你的逻辑是如何工作的。
  • 数据框中任何数字列的最大值。这是我的行是案例,列是不同的样本(1-4)。我想找到具有最高样本结果的 2 个案例。这就是为什么顶部结果在同一行时计为 1 的原因。

标签: r sorting aggregate minmax


【解决方案1】:

这是一个重塑的选项,即创建一个行序列(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

【讨论】:

    猜你喜欢
    • 2018-02-07
    • 2019-11-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-03-09
    • 2017-12-29
    • 2023-01-12
    相关资源
    最近更新 更多