自1890年以来,我一直在使用学校的学年注册数据,并且目前有月份(数字)和年份的列。我想找到一种将这些价值观归入学年的方法,以便8月至4月都来自同一学年。例如,8 / 2010-4 / 2011将来自2010学年。在SAS中,我会使用下面的代码,但我无法使我的R代码正常工作,并且我不确定自己缺少什么。我为我的R代码表示歉意,但仍在学习中。一个
SAS代码:
If Month="8" or Month="9" or Month= "10" or Month= "11" or Month="12" then SchoolYear=Year;
If Month= "1" or Month="2" or Month="3" or Month="4" then SchoolYear= Year-1;
If Month="5" or Month="6" or Month="7" then SchoolYear= "";
R代码和相应的错误:
for (i in nrow(df)) if(df$Month == 8 | df$Month == 9 |df$Month ==10| df$Month ==11 | df$Month == 12) {df$SchoolYear == df$Year} else if (df$Month == 1 | df$Month == 2 | df$Month == 3 | df$Month == 4) {df$SchoolYear == df$Year- 1} else {df$SchoolYear == "NA"}
the condition has length > 1 and only the first element will be used the condition has length > 1 and only the first element will be used
最佳答案
我们可以使用%in%
进行多个元素比较
library(dplyr)
df %>%
mutate(SchoolYear = case_when(Month %in% 8:12 ~ Year,
Month %in% 1:4 ~ Year - 1L,
Month %in% 5:7 ~ NA_integer_))
根据逻辑,可以进一步简化为
df$SchoolYear <- with(df, (NA^(Month %in% 5:7)* Year) - (Month %in% 1:4))
数据
set.seed(24)
df <- data.frame(Month = sample(1:12, 30, replace = TRUE),
Year = sample(1978:2001, 30, replace = TRUE))