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

3

我一直在使用CDC FluView数据集,通过以下代码获取:

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

我想做的是创建一个新的周变量,称为“week_new”,以便重新排序此数据集中的WEEK变量。我希望通过将第一周等于每年的第30周来重新排序它。例如,在1998年,我希望第1周对应于该年的第30周,之后每年都保持相同的比例。 我还尝试创建另一个名为“season”的新变量,它只是将每个周放入其相应的流感季节中,例如“1998-1999”代表从1998年的第30周到1999年的周数,以此类推。
我认为这涉及使用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个回答

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年之前和第30周以后的无关记录,使我们的生活变得更容易。然后,我们通过 cumsum 和一个简单的 paste 函数创建了两个新变量,seasonseason_nm。其中 season 每次看到 WEEK == 30 就会递增--这非常有用因为考虑到闰年。然后我们按照 season 进行 group_by,这样我们就可以通过 seq_along 创建 new_wk 变量。


谢谢,是的,现在这个更有意义了。我很感激。 - Nathan

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接