2017-02-09 41 views
7

mam dwie ramki danych, jeden dla sklepu i jeden do sprzedaży:Wewnętrzna przyłączenia dwóch ramek danych nadal pokazuje wszystkie wartości

store <- data.frame(StoreID=c(1,2,3,4), StoreName=c("McDonalds", "A&W", "Burger King", "Wendy's")) 
sales <- data.frame(StoreID=c(1,2,1,1,2,2), ItemID=c(2,2,3,4,4,5), SalesQty=c(10,20,30,40,50,60)) 

store  
#StoreID StoreName 
#  1 McDonalds 
#  2   A&W 
#  3 Burger King 
#  4  Wendy's 

sales 
#StoreID ItemID SalesQty 
#  1  2  10 
#  2  2  20 
#  1  3  30 
#  1  4  40 
#  2  4  50 
#  2  5  60 

Chcę je połączyć, tak że widzę StoreName dla każdej transakcji sprzedaży :

merged <- merge(sales, store, by = "StoreID") 

merged 
#StoreID ItemID SalesQty StoreName 
#  1  2  10 McDonalds 
#  1  3  30 McDonalds 
#  1  4  40 McDonalds 
#  2  2  20  A&W 
#  2  4  50  A&W 
#  2  5  60  A&W 

teraz chcę wiedzieć dla każdego połączonego StoreName w ramce danych, jak wiele różnych rzeczy zostały sprzedane:

tapply(merged$ItemID, merged$StoreName, FUN = function(x) length(unique(x))) 

#A&W Burger King McDonalds  Wendy's 
# 3   NA   3   NA 

Moje pytanie brzmi: dlaczego wynik testu pokazuje "Burger King" i "Wendy's", mimo że nie znajdują się w scalonej ramce danych?

+6

są 'Czynników, więc poziom nadal istnieją – SymbolixAU

+2

jeśli się znaki wartości przechodząc' data.frame (StoreID = ..., ..., stringsAsFactors = F) 'podczas tworzenia ramek danych, nie zobaczysz ich na wyjściu. – SymbolixAU

+1

'droplevels' to sposób na pozbycie się niewykorzystanych poziomów czynników, np. 'with (droplevels (merged), tapply (ItemID, StoreName, FUN = funkcja (x) length (unique (x)))) –

Odpowiedz

1

Dzieje się tak dlatego, ponieważ store$StoreName to factor. Podczas tworzenia ramki danych przechowywania ustawienie argumentu stringsAsFactor do FALSE spowoduje, że te nazwy sklepów bez pasującego elementu w sales zostaną usunięte podczas .

sales <- data.frame(StoreID=c(1,2,1,1,2,2), ItemID=c(2,2,3,4,4,5), SalesQty=c(10,20,30,40,50,60)) 
store <- data.frame(StoreID=c(1,2,3,4), StoreName=c("McDonalds", "A&W", "Burger King", "Wendy's"), stringsAsFactors = FALSE) 
merged <- merge(sales, store, by = "StoreID") 
tapply(merged$ItemID, merged$StoreName, FUN = function(x) length(unique(x))) 

    #A&W McDonalds 
    # 3   3 
1

Można spróbować też:

merged$StoreName <- factor(merged$StoreName) 
tapply(merged$ItemID, merged$StoreName, FUN = function(x) length(unique(x))) 

# A&W McDonalds 
# 3   3