我一直在使用此代码检索的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中编码的重要工具。
答案 0 :(得分:2)
以下是使用包dplyr
和tidyr
完成此操作的一种方法:
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
函数创建两个新变量cumsum
和paste
。 season
只会在看到WEEK == 30
时随时递增 - 由于闰年,这很有用。然后我们group_by
season
,以便seq_along
season
创建new_wk
变量。