【问题标题】:R dplyr - Add Column Based on Results in Other RowsR dplyr - 根据其他行中的结果添加列
【发布时间】:2016-07-19 13:25:19
【问题描述】:

我有一个项目编号和库存位置的列表。项目可以出现在两种类型的库存位置 - warehousepar 位置。我想在我的数据中添加一列,以指示特定项目编号是否与仓库位置相关联。样本数据如下:

item_num <- c("Item - 1", "Item - 2", "Item - 3", "Item - 1", "Item - 3", 
          "Item - 2")
locs <- c("warehouse", "par", "par", "par", "warehouse", "par")
fake_data <- tibble(item_num, locs)

fake_data
# A tibble: 6 x 2
  item_num      locs
     <chr>     <chr>
1 Item - 1 warehouse
2 Item - 2       par
3 Item - 3       par
4 Item - 1       par
5 Item - 3 warehouse
6 Item - 2       par

我想为所有Item - 1Item - 3 添加一个列TRUE,因为我的数据中都有一个仓库位置。对于Item - 2,这将是错误的。像这样的:

  item_num      locs wh_exists
1 Item - 1 warehouse      TRUE
2 Item - 2       par     FALSE
3 Item - 3       par      TRUE
4 Item - 1       par      TRUE
5 Item - 3 warehouse      TRUE
6 Item - 2       par     FALSE

我的混乱解决方案如下。

wh_locs <- fake_data %>%
  filter(locs == "warehouse")
fake_data$wh_exist <- fake_data$item_num %in% wh_locs$item_num

fake_data

# A tibble: 6 x 3
  item_num      locs wh_exist
     <chr>     <chr>    <lgl>
1 Item - 1 warehouse     TRUE
2 Item - 2       par    FALSE
3 Item - 3       par     TRUE
4 Item - 1       par     TRUE
5 Item - 3 warehouse     TRUE
6 Item - 2       par    FALSE

这可行,但在我看来,应该有一些聪明的方法来使用mutategroup_by 来获得答案,这样我就可以将它们全部保存在一组管道函数中。

谢谢。

【问题讨论】:

    标签: r dplyr


    【解决方案1】:

    我们可以使用any==

    fake_data %>%
          group_by(item_num) %>% 
          mutate(wh_exists = any(locs == "warehouse"))
    #     item_num      locs wh_exists
    #     <chr>     <chr>     <lgl>
    #1 Item - 1 warehouse      TRUE
    #2 Item - 2       par     FALSE
    #3 Item - 3       par      TRUE
    #4 Item - 1       par      TRUE
    #5 Item - 3 warehouse      TRUE
    #6 Item - 2       par     FALSE
    

    使用data.table的类似选项

    library(data.table)
    setDT(fake_data)[, wh_exists := any(locs == "warehouse"), by = item_num]
    

    【讨论】:

      【解决方案2】:

      使用group_by%in% 运算符来检查warehouse 是否在每个组的locs 内:

      library(dplyr)
      fake_data %>% group_by(item_num) %>% mutate(wh_exists = 'warehouse' %in% locs)
      
      # Source: local data frame [6 x 3]
      # Groups: item_num [3]
      # 
      #   item_num      locs wh_exists
      #     <fctr>    <fctr>     <lgl>
      # 1 Item - 1 warehouse      TRUE
      # 2 Item - 2       par     FALSE
      # 3 Item - 3       par      TRUE
      # 4 Item - 1       par      TRUE
      # 5 Item - 3 warehouse      TRUE
      # 6 Item - 2       par     FALSE
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-10-01
        • 1970-01-01
        • 2022-09-23
        • 1970-01-01
        相关资源
        最近更新 更多