如果其他语句为新变量

时间:2019-06-03 19:09:08

标签: r variables if-statement

我想对每个月的季度进行编码,并使用一行代码。我在编码财务区。因此,第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

我该如何解决?

3 个答案:

答案 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))))