我想对每个月的季度进行编码,并使用一行代码。我在编码财务区。因此,第4-6个月是1,第7-9个月是第2季度,第10-12个月是第3季度,第1-3个月是第4季度
我尝试了ifelse语句,但是第一部分给了我一个错误
ACLED$quarter<- ifelse(ACLED$month==4 & ACLED$month==5 & ACLED$month==6, 1)
Error in ifelse(ACLED$month == 4 & ACLED$month == 5 & ACLED$month == 6, : argument "no" is missing, with no default
我该如何解决?
答案 0 :(得分:1)
使用dplyr软件包和case_when函数很容易:
library(dplyr)
foo <- sample(1:12, 100, replace = TRUE)
qtr <- case_when(foo %in% 4:6 ~ 1,
foo %in% 7:9 ~ 2,
foo %in% 10:12 ~ 3,
foo %in% 1:3 ~ 4)
答案 1 :(得分:0)
直接使用dplyr的case_when
。我不确定它是否满足您的“一行代码”需求。
month <- c(1,2,3,4,5,6,7,8,9,10,11,12)
df <- data.frame(month = month)
df2 <-
df %>%
mutate(Quarter = case_when(
#Quarter 1.
month %in% c(1,2,3) ~
"First",
#Quarter 2.
month %in% c(4,5,6) ~
"Second",
#Quarter 3.
month %in% c(7,8,9) ~
"Third",
#Quarter 4.
month %in% c(10,11,12) ~
"Fourth")
)
答案 2 :(得分:0)
我主张您已经收到的更优雅的case_when
解决方案。但是,ifelse
也可以通过使用多个ifelse
函数来完成这项工作,这些函数的逻辑与来自markhogue(+1)的答案相同。请参阅ifelse
上的文档;它需要知道当条件不匹配时该怎么做-在这种情况下,有三种情况使用另一种ifelse
,另一种情况是使用NA
。第一个参数是匹配条件( if ),第二个参数是匹配条件的条件( get ),第三个是条件匹配的条件不匹配( else )。
set.seed(1)
df<-data.frame('mon' = sample(1:12, replace = T, size = 20))
df[,'qtr'] <-
ifelse(df[,'mon'] >= 1 & df[,'mon'] <= 3, 4,
ifelse(df[,'mon'] >= 4 & df[,'mon'] <= 6, 1,
ifelse(df[,'mon'] >= 7 & df[,'mon'] <= 9, 2,
ifelse(df[,'mon'] >= 10 & df[,'mon'] <= 12, 3, NA))))