Найдите 2 верхних значения в каждой строке - PullRequest
0 голосов
/ 16 октября 2018

Прямо сейчас у меня есть фрейм данных в этой форме:

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 голосов
/ 16 октября 2018

Мы можем gather и затем использовать top_n, чтобы получить верхние 2 значения.

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

Или мы также можем arrange и slice

df %>%
  gather(color, n, -year) %>%
  arrange(year, desc(n)) %>%
  group_by(year) %>%
  slice(c(1, 2))
0 голосов
/ 16 октября 2018

Попробуйте:

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() it.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...