2016-07-19 8 views
0

私は品目番号と在庫場所のリストを持っています。アイテムは、warehouseまたはparの2種類の在庫場所に表示されます。特定の品目番号が倉庫の場所に関連付けられているかどうかを示すために、データに列を追加したいと考えています。サンプルデータは以下の通りです:R dplyr - 他の行の結果に基づいて列を追加

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の場合はfalseになります。このようなもの:

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を使用するためのいくつかの巧妙な方法があるべきだと私には思えます。

ありがとうございます。

答えて

3

我々は==data.table

を使用して

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 

同様のオプションを指定してanyを使用することができます

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

warehouseグループごとにlocs内にあるかどうかを確認するために%in%オペレータと利用group_by

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 
関連する問題