首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >嵌套的ifelse语句不像预期的那样起作用。

嵌套的ifelse语句不像预期的那样起作用。
EN

Stack Overflow用户
提问于 2022-07-27 22:58:41
回答 2查看 48关注 0票数 0

只有第一个ifelse语句按预期工作。否则,大部分交易天数不正确地归入“1-7天”类别。状态可以是“出售”的,也可以是“可用的”。Transaction_Days是一个字符变量,它是>=0。

代码语言:javascript
复制
pl_df$Event_Time_Category <- ifelse(pl_df$Status=="SOLD",
                                 ifelse(pl_df$Transaction_Days<1, '0-1 Day of Game',
                                  ifelse(pl_df$Transaction_Days>0 & pl_df$Transaction_Days<8 , '1-7 Days',
                                    ifelse(pl_df$Transaction_Days>7 & pl_df$Transaction_Days<32, '7-31 Days',
                                       ifelse(pl_df$Transaction_Days>31 & pl_df$Transaction_Days<91, '31-90 Days', '90+ Days Out')))), '')

实际产出:

代码语言:javascript
复制
Transaction_Days Event_Time_Category 
   72            1-7 Days   
    3            1-7 Days   
   10            1-7 Days   
   37            1-7 Days   
   61            1-7 Days   
   35            1-7 Days   
  126            1-7 Days   
   92            90+ Days Out   
   53            1-7 Days   
   11            1-7 Days   
   48            1-7 Days   
   19            1-7 Days   
   21            1-7 Days   
   66            1-7 Days   
   20            1-7 Days   
   49            1-7 Days   
   21            1-7 Days   
   43            1-7 Days   
   31            1-7 Days   
    0            0-1 Day of Game   

预期产出:

代码语言:javascript
复制
Transaction_Days Event_Time_Category 
   72            31-90 Days   
    3            1-7 Days   
   10            7-31 Days   
   37            31-90 Days   
   61            31-90 Days   
   35            31-90 Days   
  126            90+ Days Out   
   92            90+ Days Out   
   53            31-90 Days   
   11            7-31 Days   
   48            31-90 Days   
   19            7-31 Days   
   21            7-31 Days   
   66            31-90 Days   
   20            7-31 Days   
   49            31-90 Days   
   21            7-31 Days   
   43            31-90 Days   
   31            7-31 Days   
    0            0-1 Day of Game   

下面是有关dataframe的更多详细信息:

代码语言:javascript
复制
structure(list(Promoter = c("ABC", "ABC", "ABC", "ABC", "ABC", 
"ABC"), Event.Date = c("2022-07-27 13:10:00", "2022-07-27 13:10:00", 
"2022-07-27 13:10:00", "2022-07-27 13:10:00", "2022-07-27 13:10:00", 
"2022-07-27 13:10:00"), Description = c("Twins @ Brewers", "Twins @ Brewers", 
"Twins @ Brewers", "Twins @ Brewers", "Twins @ Brewers", "Twins @ Brewers"
), Performer = c("Milwaukee Brewers", "Milwaukee Brewers", "Milwaukee Brewers", 
"Milwaukee Brewers", "Milwaukee Brewers", "Milwaukee Brewers"
), Category = c("MLB", "MLB", "MLB", "MLB", "MLB", "MLB"), Transaction.Date = c("2022-05-16 17:42:00", 
"2022-07-24 21:12:00", "2022-07-17 14:16:00", "2022-06-20 13:24:00", 
"2022-05-27 17:24:00", "2022-06-22 19:25:00"), Zone = c("Field Diamond Box", 
"Field Diamond Box", "Field Diamond Box", "Field Infield Box", 
"Field Infield Box", "Field Infield Box"), Section = c(111L, 
111L, 111L, 110L, 110L, 110L), Row = c("3", "4", "4", "6", "6", 
"6"), Seat = c("9, 10", "5, 6", "7, 8", "10, 11, 12", "5, 6, 7", 
"8, 9"), Quantity = c(2L, 2L, 2L, 3L, 3L, 2L), Status = c("SOLD", 
"SOLD", "SOLD", "SOLD", "SOLD", "SOLD"), Price = c(85.47, 72.05, 
72.86, 45.36, 44.73, 43.75), Cost = c(164, 164, 164, 174, 174, 
116), Revenue = c(170.94, 144.1, 145.72, 136.08, 134.19, 87.5
), Profit = c(6.94, -19.9, -18.28, -37.92, -39.81, -28.5),  Event_Date = structure(c(19200, 19200, 19200, 19200, 
19200, 19200), class = "Date"), Transaction_Date = structure(c(19128, 
19197, 19190, 19163, 19139, 19165), class = "Date"), Alias = c(" Twins @ Brewers", 
" Twins @ Brewers", " Twins @ Brewers", " Twins @ Brewers", " Twins @ Brewers", 
" Twins @ Brewers"), Cost_Per_Ticket = c(82, 82, 82, 58, 58, 
58), Revenue_Per_Ticket = c("85.47", "72.05", "72.86", "45.36", 
"44.73", "43.75"), Pack_Size = c("2", "2", "2", "3", "3", "2"
), Transaction_Days = c("72", "3", "10", "37", "61", "35"), Event_Time_Category = c("1-7 Days", 
"1-7 Days", "1-7 Days", "1-7 Days", "1-7 Days", "1-7 Days"), 
    Event_Time = c("01:10 PM", "01:10 PM", "01:10 PM", "01:10 PM", 
    "01:10 PM", "01:10 PM")), row.names = c(NA, 6L), class = "data.frame")
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2022-07-27 23:52:31

让我们先将文本改为数字,然后进行数字比较,而不是按字母顺序进行比较。(8 < 10"8" > "10")

然后,使用ifelse链,您可以删除冗余测试。例如,如果我们知道这个数字不是<1,那么我们就不需要测试它是否是>0

代码语言:javascript
复制
pl_df$Transaction_Days = as.numeric(pl_df$Transaction_Days)

pl_df$Event_Time_Category <- 
  ifelse(pl_df$Status=="SOLD",
         ifelse(pl_df$Transaction_Days<1, '0-1 Day of Game',
                ifelse(pl_df$Transaction_Days<8 , '1-7 Days',
                       ifelse(pl_df$Transaction_Days<32, '7-31 Days',
                              ifelse(pl_df$Transaction_Days<91, '31-90 Days', '90+ Days Out')))), '')

对于dplyr::case_when来说,这是一个很好的用例,我认为它更容易阅读和维护。它在输出与它遇到的第一个真实测试相对应的地方工作。

代码语言:javascript
复制
library(dplyr)
pl_df %>%
  mutate(Event_Time_Category = case_when(
    Status != "SOLD"      ~ '',  # Blank if not SOLD
    Transaction_Days < 1  ~ '0-1 Day of Game',
    Transaction_Days < 8  ~ '1-7 Days',
    Transaction_Days < 32 ~ '7-31 Days',
    Transaction_Days < 91 ~ '31-90 Days', 
    TRUE ~ '90+ Days Out'))
票数 1
EN

Stack Overflow用户

发布于 2022-07-27 23:29:36

利用cut

代码语言:javascript
复制
lbs <- c(paste0(c(0, 1,7,31),'-', c(1, 7, 31, 90), ' Days'), '90+ Days')

transform(df, Event_Time_cat = cut(Transaction_Days, c(-Inf, 1, 7, 31, 90, Inf), lbs))

   Transaction_Days Event_Time_cat
1                72     31-90 Days
2                 3       1-7 Days
3                10      7-31 Days
4                37     31-90 Days
5                61     31-90 Days
6                35     31-90 Days
7               126       90+ Days
8                92       90+ Days
9                53     31-90 Days
10               11      7-31 Days
11               48     31-90 Days
12               19      7-31 Days
13               21      7-31 Days
14               66     31-90 Days
15               20      7-31 Days
16               49     31-90 Days
17               21      7-31 Days
18               43     31-90 Days
19               31      7-31 Days
20                0       0-1 Days
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/73145455

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档