R 巨型嵌套ifelse语句的备选方案

R 巨型嵌套ifelse语句的备选方案,r,if-statement,nested,R,If Statement,Nested,我有一个如下所示的数据框: Period No. Frequency 1 Month 2 Month 3 Month 3 Quarter 6 Quarter 9 Quarter 1 YTD 2 YTD 3 YTD 我想添加一个名为“Period”的列,其值由Period No.和Frequency列中的内

我有一个如下所示的数据框:

Period No.  Frequency
1           Month
2           Month
3           Month
3           Quarter
6           Quarter     
9           Quarter
1           YTD
2           YTD
3           YTD
我想添加一个名为“Period”的列,其值由Period No.和Frequency列中的内容决定。因此:

Period No.  Frequency  Period
1           Month      1
2           Month      2
3           Month      3
3           Quarter    Q1
6           Quarter    Q2 
9           Quarter    Q3
1           YTD        YTD-Jan
2           YTD        YTD-Feb
3           YTD        YTD-Mar
现在,我正在使用嵌套的if语句来实现这一点。例如:

data$Period <-
  ifelse(
    (data$`Period No.` == '3') & (data$Frequency == 'Q1'), 'Q1',
    ifelse(
      (data$`Period No.` == '6') & (data$Frequency == 'Q2'), 'Q2',
      ifelse(
        (data$`Period No.` == '9') & (data$Frequency == 'Q3'), 'Q3', 'ERROR'
)
)
)
data$Period如果条件本身是嵌套的,那么实际上只需要嵌套
ifelse
语句。在这种情况下,条件是互斥的,因此您可以单独指定给每个集合。我们还可以巧妙地使用
粘贴和一些数学来创建结果,而不是列出所有的可能性:

df$Period[df$Frequency == "Month"] = as.character(df$Period_No[df$Frequency == "Month"])
df$Period[df$Frequency == "Quarter"] = paste0("Q", (df$Period_No[df$Frequency == "Quarter"] - 1) %/% 3 + 1)
df$Period[df$Frequency == "YTD"] = paste0("YTD-", month.abb[df$Period_No[df$Frequency == "YTD"]])

df
#   Period_No Frequency  Period
# 1         1     Month       1
# 2         2     Month       2
# 3         3     Month       3
# 4         3   Quarter      Q1
# 5         6   Quarter      Q2
# 6         9   Quarter      Q3
# 7         1       YTD YTD-Jan
# 8         2       YTD YTD-Feb
# 9         3       YTD YTD-Mar
如果您喜欢
dplyr
,我建议使用
case\u when
功能:

df %>% mutate(Period = case_when(
    Frequency == "Month" ~ as.character(Frequency),
    Frequency == "Quarter" ~ paste0("Q", (Period_No - 1) %/% 3 + 1),
    Frequency == "YTD" ~ paste0("YTD-", month.abb[Period_No])
))

使用此示例数据:

df = read.table(text = "Period_No  Frequency
1           Month
2           Month
3           Month
3           Quarter
6           Quarter     
9           Quarter
1           YTD
2           YTD
3           YTD", header = T)
如果条件本身是嵌套的,那么实际上只需要嵌套
ifelse
语句。在这种情况下,条件是互斥的,因此您可以单独指定给每个集合。我们还可以巧妙地使用
粘贴和一些数学来创建结果,而不是列出所有的可能性:

df$Period[df$Frequency == "Month"] = as.character(df$Period_No[df$Frequency == "Month"])
df$Period[df$Frequency == "Quarter"] = paste0("Q", (df$Period_No[df$Frequency == "Quarter"] - 1) %/% 3 + 1)
df$Period[df$Frequency == "YTD"] = paste0("YTD-", month.abb[df$Period_No[df$Frequency == "YTD"]])

df
#   Period_No Frequency  Period
# 1         1     Month       1
# 2         2     Month       2
# 3         3     Month       3
# 4         3   Quarter      Q1
# 5         6   Quarter      Q2
# 6         9   Quarter      Q3
# 7         1       YTD YTD-Jan
# 8         2       YTD YTD-Feb
# 9         3       YTD YTD-Mar
如果您喜欢
dplyr
,我建议使用
case\u when
功能:

df %>% mutate(Period = case_when(
    Frequency == "Month" ~ as.character(Frequency),
    Frequency == "Quarter" ~ paste0("Q", (Period_No - 1) %/% 3 + 1),
    Frequency == "YTD" ~ paste0("YTD-", month.abb[Period_No])
))

使用此示例数据:

df = read.table(text = "Period_No  Frequency
1           Month
2           Month
3           Month
3           Quarter
6           Quarter     
9           Quarter
1           YTD
2           YTD
3           YTD", header = T)