自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))

07-28 03:17
查看更多