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)