我想把月份编码成季度,并为其使用一行代码。我在为财政季度编码。月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)如果== 4和== $ == 5和ACLED$== 6中出现错误,参数" no“缺失,没有默认值
我该怎么解决这个问题?
发布于 2019-06-03 19:30:09
如果您使用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)发布于 2019-06-03 19:29:31
这是直接与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")
)发布于 2019-06-03 19:43:29
我将倡导您已经收到的更优雅的case_when解决方案。但是,ifelse也可以使用与markhogue (+1)的答案相同的逻辑的多个ifelse函数来完成这项工作。请参阅关于ifelse的文档;当标准不匹配时,它需要知道该做什么--在本例中,使用另一个ifelse和一个是NA的情况下有三次。第一个参数是匹配条件(如果),第二个参数是如果条件匹配(get),第二个参数是如果条件不匹配怎么办(否则)。
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))))https://stackoverflow.com/questions/56433237
复制相似问题