R dataframe - 具有列名称的行中的前 n 个值

标签 r dataframe tidyverse top-n

我想对特定列中的行值进行排序,获取前“n”个值,并在新列中获取相应的列名称。

输出看起来像这样:

      SL   SW    PL    PW   Species high1 high2 high3 col1 col2  col3
      dbl> <dbl> <dbl> <dbl> <fct>  <dbl> <dbl>  <dbl>
 1     5.1  3.5  1.4    0.2   setosa   3.5  1.4   0.2  SW   PL     PW
 2     4.9  3    1.4    0.2   setosa   3    1.4   0.2  SW   PL     PW
 3     4.7  3.2  1.3    0.2   setosa   3.2  1.3   0.2  SW   PL     PW

尝试了类似下面的代码,但无法获取列名称。 我希望实现的是将最高的“n”值(行[n])与每行数据框中的值进行比较,然后提取匹配值的相应列名称。例如。 rows[1] == 3.5(来自“SW”列)。这可行吗? 感谢帮助。

 iris %>% 
      rowwise() %>%
      mutate(rows = list(sort(c( Sepal.Width, Petal.Length, Petal.Width), decreasing = TRUE))) %>%
      mutate(high1 = rows[1], col1 = names(~.)[which(~.[] ==rows[1]),
             high2 = rows[2], col2 = names(~.)[which(~.[] ==rows[2]),
             high3 = rows[3], col3 = names(~.)[which(~.[] ==rows[3])
             ) %>%
      select(-rows)

最佳答案

您可以转为长,按相应的原始行分组,使用 slice_max 获取顶部值,然后转回宽并将该输出绑定(bind)到原始表。

library(dplyr, warn.conflicts = FALSE)
library(tidyr)

iris %>% 
  group_by(rn = row_number()) %>% 
  pivot_longer(-c(Species, rn), 'col', values_to = 'high') %>% 
  slice_max(col, n = 2) %>% 
  mutate(nm = row_number()) %>% 
  pivot_wider(values_from = c(high, col), 
              names_from = nm) %>% 
  ungroup() %>% 
  select(-c(Species, rn)) %>% 
  bind_cols(iris)
#> # A tibble: 150 × 9
#>    high_1 high_2 col_1   col_2 Sepal.Length Sepal.Width Petal.Length Petal.Width
#>     <dbl>  <dbl> <chr>   <chr>        <dbl>       <dbl>        <dbl>       <dbl>
#>  1    5.1    3.5 Sepal.… Sepa…          5.1         3.5          1.4         0.2
#>  2    4.9    3   Sepal.… Sepa…          4.9         3            1.4         0.2
#>  3    4.7    3.2 Sepal.… Sepa…          4.7         3.2          1.3         0.2
#>  4    4.6    3.1 Sepal.… Sepa…          4.6         3.1          1.5         0.2
#>  5    5      3.6 Sepal.… Sepa…          5           3.6          1.4         0.2
#>  6    5.4    3.9 Sepal.… Sepa…          5.4         3.9          1.7         0.4
#>  7    4.6    3.4 Sepal.… Sepa…          4.6         3.4          1.4         0.3
#>  8    5      3.4 Sepal.… Sepa…          5           3.4          1.5         0.2
#>  9    4.4    2.9 Sepal.… Sepa…          4.4         2.9          1.4         0.2
#> 10    4.9    3.1 Sepal.… Sepa…          4.9         3.1          1.5         0.1
#> # … with 140 more rows, and 1 more variable: Species <fct>

reprex package 于 2022 年 2 月 16 日创建(v2.0.1)

编辑删除了不必要的重命名变异,感谢@Onyambu的提示!

关于R dataframe - 具有列名称的行中的前 n 个值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/71151048/

相关文章:

r - 从 R 中的当前日期获取下个季度的开始

r - Shiny R 中的水平滚动问题

r - 如何在 R 中创建复杂的气泡图

python - 如果另一列中的值匹配,如何填充列中的 nan 值

r - 使用 group_by 后如何在 for 循环中使用 mutate?

r - 设置带有刻度的分类轴标签 "free"ggplot2

r - 在R中拆分多列

python - 将标题名称添加到 pandas 数据框中的一组列?

tidyverse 中的重复变异

r - 如何按组确定两列和两行的两个日期之间的天数差异?