创建新列以根据现有列中的值标记变量

时间:2017-04-05 12:08:48

标签: r dplyr

我拥有的数据集包含30k +产品,我正在尝试添加新列,以根据subCategory_id对这些产品进行分类。

我需要4个标签,“Premium”,“Base”,“Other”,“New”。

这就是数据库的样子,只是头部。

product_id product_origin product_price subCategory_id    GBP
          1      Australia    0.36154597              1 371.31
          2            USA    0.14425684              1 148.15
          3            USA    0.09020571              1  92.64
          5            USA    0.35793051              1 367.59
          6            USA    0.19523482              1 200.51

数据集名为random。我已经尝试了这个,因为类别ID不按顺序排列,但我没有运气。

random %>%
    mutate(ifelse(subCategory_id %in% c(1:12, 16, 67:71, 73,74, 78,79, 82, 85:89, 91:104), "Premium", 
          ifelse(subCategory_id %in% c(19:21, 35, 56,57,61), "Base",
          ifelse(subCategory_id %in% c(13:15, 17, 18, 22:28, 30:33),"New"))))

任何帮助都将受到高度赞赏!!!

3 个答案:

答案 0 :(得分:2)

我们可以使用键/值列表然后加入

keyVal <- list(Premium= c(1:12, 16, 67:71, 73,74, 78,79, 82, 85:89, 91:104),  
          Base = c(19:21, 35, 56,57,61), 
          New = c(13:15, 17, 18, 22:28, 30:33))

library(dplyr)
random %>% 
       left_join(., stack(keyVal), by = c(subCategory_id = "values"))

答案 1 :(得分:1)

你可以试试像这样简单的东西吗?

random$productcategory <- ""
random$productcategory[random$subCategory_id %in% c(1:12, 16, 67:71, 73,74, 78,79, 82, 85:89, 91:104)] <- "Premium"

答案 2 :(得分:1)

dplyr的最新版本有一个名为case_when的函数。我认为这是解决问题的更好方法:

library(dplyr)

random <- random %>% 
   mutate(label = case_when(
      .$subCategory_id %in% c(1:12, 16, 67:71, 73,74, 78,79, 82, 85:89, 91:104) ~ "Premium",  
      .$subCategory_id %in% c(19:21, 35, 56,57,61) ~ "Base",
      .$subCategory_id %in% c(13:15, 17, 18, 22:28, 30:33) ~ "New"
   ))

如果使用命令devtools::install_github("hadley/dplyr")从GitHub安装最新版本,则不必在变量名称前使用.$