现在我有一个这样的数据框:
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
中这样做?
答案 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
或者我们也可以arrange
和slice
df %>%
gather(color, n, -year) %>%
arrange(year, desc(n)) %>%
group_by(year) %>%
slice(c(1, 2))