使用dplyr / tidyr将行转换为R数据框中的列

时间:2017-10-30 00:01:17

标签: r dataframe dplyr tidyr

我有一个这样的数据框:

year <-c(floor(runif(100,min=2015, max=2017)))
month <- c(floor(runif(100, min=1, max=13)))
inch <- c(floor(runif(100, min=0, max=10)))
mm <- c(floor(runif(100, min=0, max=100)))
df = data.frame(year, month, inch, mm);

year month inch mm
2016    11    0 10
2015     9    3 34
2016     6    3 33
2015     8    0 77

我只关心列yearmonthmm

我需要重新排列数据框,以便第一列是月份的名称,其余列是mm的值。

Months  2015  2016
Jan     #    #
Feb
Mar
Apr
May
Jun
Jul
Aug
Sep
Oct
Nov
Dec

所以有两件事需要发生。 (1)月份需要成为当月前三个字母的字符串。 (2)我需要按年份分组,然后将mm值放在该年下的一列中。

到目前为止,我有这段代码,但我无法弄清楚:

df %>% 
  select(-inch) %>% 
  group_by(month) %>% 
  summarize(mm = mm) %>% 
  ungroup()

1 个答案:

答案 0 :(得分:6)

要将月份转换为姓名,您可以参考month.abb;然后,您可以按年份和月份汇总spread到宽格式:

library(dplyr)
library(tidyr)
df %>% 
   group_by(year, month = month.abb[month]) %>% 
   summarise(mm = mean(mm)) %>%    # use mean as an example, could also be sum or other 
                                   # intended aggregation methods
   spread(year, mm) %>% 
   arrange(match(month, month.abb))  # rearrange month in chronological order

# A tibble: 12 x 3
#   month   `2015`   `2016`
#   <chr>    <dbl>    <dbl>
# 1   Jan 65.50000 28.14286
# 2   Feb 54.40000 30.00000
# 3   Mar 23.50000 95.00000
# 4   Apr  7.00000 43.60000
# 5   May 45.33333 44.50000
# 6   Jun 70.33333 63.16667
# 7   Jul 72.83333 52.00000
# 8   Aug 53.66667 66.50000
# 9   Sep 51.00000 64.40000
#10   Oct 74.00000 39.66667
#11   Nov 66.20000 58.71429
#12   Dec 38.25000 51.50000