在每行中找到前2个值

时间:2018-10-16 05:50:12

标签: r dplyr

现在我有一个这样的数据框:

year  blue  red   yellow  orange  pink  white
2012   1     2      3        4       5    6
2013   12    14     28       11      0    5

如果我想找到每行的前2个,并以此结果作为数据框:

year  color   n
2012  white   6
2012  pink    5
2013  yellow  28
2013  red     14

我该如何在基数R或dplyr中这样做?

2 个答案:

答案 0 :(得分:0)

尝试一下:

library(dplyr)
library(tidyr)

df %>% 
  gather(color, value, -year) %>% 
  group_by(year) %>% 
  distinct(value) %>% 
  arrange(desc(value)) %>% 
  # now we select the TOP 2
  slice(1:2) %>% 
  # now we add the colors
  left_join(df %>% 
              gather(color, value, -year)) %>% 
  select(1, 3, 2)

输出为:

 # A tibble: 4 x 3
 # Groups:   year [2]
    year color  value
   <int> <chr>  <int>
 1  2012 white      6
 2  2012 pink       5
 3  2013 yellow    28
 4  2013 red       14

如果您进一步使用此数据框,请不要忘记ungroup()

答案 1 :(得分:0)

我们可以gather,然后使用top_n来获取前两个值。

library(tidyverse)

df %>%
  gather(color, n, -year) %>%
  group_by(year) %>%
  top_n(2, n)


#   year color      n
#  <int> <chr>  <int>
#1  2013 red       14
#2  2013 yellow    28
#3  2012 pink       5
#4  2012 white      6

或者我们也可以arrangeslice

df %>%
  gather(color, n, -year) %>%
  arrange(year, desc(n)) %>%
  group_by(year) %>%
  slice(c(1, 2))