如何在R中重新排序数据,并为数据创建新变量?

时间:2016-04-18 14:17:59

标签: r

我一直在使用此代码检索的CDC FluView数据集:

    library(cdcfluview)
    library(ggplot2)
    usflu <- get_flu_data("national", "ilinet", years=1998:2015)

我要做的是创建一个新的周变量,将其称为&#34; week_new&#34;,以便重新排序此数据集中的WEEK变量。我希望通过让第一周等于每年的第30周来重新排序。例如,在1998年,而不是对应于该年第一周的第1周,我希望第30周对应于该年的第一周,之后的每一年都具有相同的比例。我还试图创建另一个名为&#34; season&#34;的新变量,它简单地将每个星期放入相应的流感季节,比如&#34; 1998-1999&#34;从1998年到1999年的第30周,依此类推。

我相信这涉及for循环和条件语句,但我不熟悉如何在R中使用它们。我是编程新手并且同时学习Java和R,并且只使用循环Java到目前为止。

这是我到目前为止所尝试的内容,我认为它应该是这样的:

    wk_num <- 1
    for(i in nrow(usflu)){
      if(week == 31){
        wk_num <- 1
        wk_new[i] <- wk_num
        wk_num <- wk_num+1
        }
      if(week < 53){
        season[i] <- paste(Yr[i], '-', Yr[i] +1)
      }
      else{
      }

非常感谢任何帮助,希望我所要求的是有道理的。我希望了解对未来的重新排序,因为我相信它将成为我在R中编码的重要工具。

1 个答案:

答案 0 :(得分:2)

以下是使用包dplyrtidyr完成此操作的一种方法:

library(dplyr)
library(tidyr)

usflu_df <- tbl_df(usflu)

usflu_df %>%
  complete(YEAR, WEEK) %>%
  filter(!(YEAR == 1998 & WEEK < 30)) %>%
  mutate(season = cumsum(WEEK == 30),
         season_nm = paste(1997 + season, 1998 + season, sep = "-")) %>%
  group_by(season) %>%
  mutate(new_wk = seq_along(season)) %>%
  select(YEAR, WEEK, new_wk, season, season_nm)

#     YEAR  WEEK new_wk season season_nm
#    (int) (int)  (int)  (int)     (chr)
# 1   1998    30      1      1 1998-1999
# 2   1998    31      2      1 1998-1999
# 3   1998    32      3      1 1998-1999
# 4   1998    33      4      1 1998-1999
# 5   1998    34      5      1 1998-1999
# 6   1998    35      6      1 1998-1999
# 7   1998    36      7      1 1998-1999
# 8   1998    37      8      1 1998-1999
# 9   1998    38      9      1 1998-1999
# 10  1998    39     10      1 1998-1999

通过这个谈论...

首先,使用tidyr::complete将隐式缺失值转换为显式缺失值 - 撤回的原始数据没有1998年的所有周数。接下来,filter显示1998年的无关记录也就是说,1998年和30周前一周的任何事情都会让我们的生活变得更轻松。然后,我们通过season和一个简单的season_nm函数创建两个新变量cumsumpasteseason只会在看到WEEK == 30时随时递增 - 由于闰年,这很有用。然后我们group_by season,以便seq_along season创建new_wk变量。