r - 使用带条件的基础 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>)
解决方案
您可以使用 删除空格trimws
。您也可以使用fcase
(或case_when
in 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
推荐阅读
- amazon-web-services - dynamodb.put(...).promise.then 不是 AWS 中的函数
- javascript - 如何使用链接在 chart.js 中制作图表
- oracle - Oracle 函数 Select Into 无法正常工作
- javascript - 使用子组件和 react-redux (React typesciprt)
- php - 如何将 EAN 转换为 ASIN 以进行 amazon paapi 集成
- mongodb - 嵌套查询在 GraphQL 中返回空值 - Next JS
- java -
. @ 尝试使用 java 和 MySQL 从数组返回时返回 - flutter - 当引用丢失时,垃圾收集器会关闭流控制器吗?
- python - 如何根据字典键和值过滤熊猫数据框行?
- react-native - 在 Web 项目上使用 React Navigation 时无法获取 /pageName