首页 > 解决方案 > 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")

这是我当前方法的预览,不确定为什么它没有响应这种情况。如果名称 == "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)))

有什么建议么?

标签: rdplyrcase-when

解决方案


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

推荐阅读