[英]R dplyr - Add Column Based on Results in Other Rows
我有一個項目編號和庫存位置的列表。 物料可以出現在兩種類型的庫存地點中- warehouse
或par
地點。 我想在數據中添加一列,以指示某個特定的物料編號是否與倉庫位置相關聯。 示例數據如下:
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 - 1
和Item - 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
這行得通,但在我看來,應該有某種聰明的方法使用mutate
和group_by
來獲取答案,以便將其全部保留在一組管道函數中。
謝謝。
我們可以在==
使用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]
將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
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.