2017-02-09 10 views
7

すべての値を示す2つのデータフレームの結合:インナーはまだ私は2つのデータフレーム、販売店用と1を持っている

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 

私は、各販売取引のためにStoreNameをを見ることができるように、それらをマージしたいです:

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 

今、私は別のアイテムが販売されたどのように多く、マージされたデータフレーム内の各StoreNameをするために知ってほしい:

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

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

私の質問は、合併されたデータフレームにないのに、なぜ「バーガーキング」と「ウェンディーズ」が表示されるのですか?

+6

を、彼らは 'factors'あるので、あなたは' data.frameを行くことによって値の文字を加えた場合のレベルはまだ – SymbolixAU

+2

を存在(StoreID = ...、 ...、stringsAsFactors = F) 'を実行すると、出力には表示されません。 – SymbolixAU

+1

'液滴 'は、未使用の因子レベルを取り除く方法です。 (ItemID、StoreName、FUN = function(x)length(ユニーク(x)))) ' –

答えて

1

store$StoreNamefactorです。店舗データフレームを作成するときに、stringsAsFactorFALSEに設定すると、一致する要素のない店舗名がの間に削除されます。salesが削除されます。

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

あなたもこれを試すことができます。

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

# A&W McDonalds 
# 3   3 
関連する問題