r-case_when输出由两个字符列调节



我目前正在尝试基于两个字符的列填充一列。

样本代码:

A <- structure(list(Name = c("Piece 1", "Piece 1", "Piece 1","Piece 1"), Size = c("S", 
  "M", "L", NA_character_), SKU = c(NA_character_, NA_character_, NA_character_,NA_character_
  )), row.names = c(NA, -4L), class = "data.frame")

这是我目前方法的预览,不确定为什么它对这种情况没有反应。如果Name==";X〃;并且大小==";Y"~"自定义字段":

A <- A %>%
mutate(Size = replace_na(Size, "OS")) %>%
mutate(SKU = case_when(
SKU == (Name == "Piece1" & 
Size == "S") ~ "PS",
SKU == (Name == "Piece1" & 
Size == "M") ~ "PM",
SKU == (Name == "Piece1" & 
Size == "L") ~ "PL",
SKU == (Name == "Piece1" & 
Size == "OS") ~ "POS",
TRUE ~ as.character(SKU)))

有什么建议吗?

SKU ==case_when中似乎没有必要。此外,要匹配的文本应该是精确的。您正在与Name == "Piece1"进行比较,但在数据中您有"Piece 1"(带空格(。

library(dplyr)
A %>%
mutate(SKU = case_when(
Name == "Piece 1" & Size == "S" ~ "PS",
Name == "Piece 1" & Size == "M" ~ "PM",
Name == "Piece 1" & Size == "L" ~ "PL",
TRUE ~ as.character(SKU)))
#     Name Size SKU
#1 Piece 1    S  PS
#2 Piece 1    M  PM
#3 Piece 1    L  PL

对于处理NA值的更新数据-

A %>%
mutate(SKU = replace(Size, is.na(Size), 'OS'),
#tidyr::replace_na also works
#SKU = tidyr::replace_na(Size, 'OS'),
SKU = case_when(
Name == "Piece 1" & Size == "S" ~ "PS",
Name == "Piece 1" & Size == "M" ~ "PM",
Name == "Piece 1" & Size == "L" ~ "PL",
TRUE ~ as.character(SKU)))
#     Name Size SKU
#1 Piece 1    S  PS
#2 Piece 1    M  PM
#3 Piece 1    L  PL
#4 Piece 1 <NA>  OS

最新更新