首页 > 解决方案 > 使用带条件的基础 ifelse

问题描述

我的条件之一是:如果可用性 == “不可用”,它将自动成为类别列下的 Cat A。但是,当我使用 == "Not Available" 时,它只会从 newdf$Options 打印出默认值,而当我使用 != "Available" 时,它会打印出我想要的输出。我似乎无法弄清楚为什么 == "Not Available" 不起作用。

我的另一个条件是:如果 CatBCol 出现在 Colour 中,它会在选项下自动为 Cat B,其余为 Cat A。

CatACol<-c("Black","Brown","Maroon")
CatBCol<- c("Orange","Pink")

newdf <- setDT(df)[ ,paste0("Colour", 1:2) := tstrsplit(df$Colour, ",",  type.convert = TRUE, fixed = TRUE)]
newdf$Options <- ifelse((newdf$Colour1 %in% CatBCol), "Cat B",ifelse((newdf$Colour2 %in% CatBCol),"Cat B", "Cat A"))
newdf$Categories <- ifelse((newdf$Availability == "Not Available"), "Cat A", newdf$Options)

预期输出:

         Colour   Availability Colour1 Colour2 Options Categories
1:        Black      Available   Black    <NA>   Cat A      Cat A
2:        Brown Not Available    Brown    <NA>   Cat A      Cat A
3:       Maroon Not Available   Maroon    <NA>   Cat A      Cat A
4:       Orange      Available  Orange    <NA>   Cat B      Cat B
5:         Pink      Available    Pink    <NA>   Cat B      Cat B
6:   Black,Pink      Available   Black    Pink   Cat B      Cat B
7: Brown,Orange Not Available    Brown  Orange   Cat B      Cat A
8:  Maroon,Pink      Available  Maroon    Pink   Cat B      Cat B

实际输出:

         Colour   Availability Colour1 Colour2 Options Categories
1:        Black      Available   Black    <NA>   Cat A      Cat A
2:        Brown Not Available    Brown    <NA>   Cat A      Cat A
3:       Maroon Not Available   Maroon    <NA>   Cat A      Cat A
4:       Orange      Available  Orange    <NA>   Cat B      Cat B
5:         Pink      Available    Pink    <NA>   Cat B      Cat B
6:   Black,Pink      Available   Black    Pink   Cat B      Cat B
7: Brown,Orange Not Available    Brown  Orange   Cat B      Cat B
8:  Maroon,Pink      Available  Maroon    Pink   Cat B      Cat B

我的数据框

structure(list(Colour = structure(c(1L, 3L, 5L, 7L, 8L, 2L, 4L, 
6L), .Label = c("Black", "Black,Pink", "Brown", "Brown,Orange", 
"Maroon", "Maroon,Pink", "Orange", "Pink"), class = "factor"), 
    Availability = structure(c(1L, 2L, 2L, 1L, 1L, 1L, 2L, 1L
    ), .Label = c("Available", "Not Available "), class = "factor"), 
    Colour1 = c("Black", "Brown", "Maroon", "Orange", "Pink", 
    "Black", "Brown", "Maroon"), Colour2 = c(NA, NA, NA, NA, 
    NA, "Pink", "Orange", "Pink")), class = c("data.table", "data.frame"
), row.names = c(NA, -8L), .internal.selfref = <pointer: 0x000002a5fdbc1ef0>)

标签: r

解决方案


您可以使用 删除空格trimws。您也可以使用fcase(或case_whenin dplyr) 包含多个ifelse条件。

library(data.table)
newdf[, Availability := trimws(Availability)]

newdf[, Categories := fcase(Availability == 'Not Available', 'Cat A', 
                            Colour1 %in% CatBCol | Colour2 %in% CatBCol, 'Cat B', 
                            default = 'Cat A')]

newdf
#         Colour  Availability Colour1 Colour2 Categories
#1:        Black     Available   Black    <NA>      Cat A
#2:        Brown Not Available   Brown    <NA>      Cat A
#3:       Maroon Not Available  Maroon    <NA>      Cat A
#4:       Orange     Available  Orange    <NA>      Cat B
#5:         Pink     Available    Pink    <NA>      Cat B
#6:   Black,Pink     Available   Black    Pink      Cat B
#7: Brown,Orange Not Available   Brown  Orange      Cat A
#8:  Maroon,Pink     Available  Maroon    Pink      Cat B

推荐阅读