2016-10-25 58 views
0

我想獲取數據框的唯一行,然後將其與另一行屬性進行連接。然後,我希望能夠計算品種的數量,例如特定類型或來源的獨特水果的數量。在R中合併數據幀的優雅方式?

的第一個數據幀有我水果的清單:

fruits <- read.table(header=TRUE, text="shop fruit 
        1 apple 
        2 orange 
        3 apple 
        4 pear 
        2 banana 
        1 banana 
        1 orange 
        3 banana") 

第二個數據幀有我的屬性:

fruit_class <- read.table(header=TRUE, text="fruit type origin 
apple pome asia 
         banana berry asia 
         orange citrus asia 
         pear pome newguinea") 

這裏是我的笨拙的解決問題的辦法:

fruit <- as.data.frame(unique(fruit[,2])) #get a list of unique fruits 
colnames(fruit)[1] <- "fruit" #this won't rename the column and I don't know why... 
fruit_summary <- join(fruits, fruit_class, by="fruit" #create a data frame that I can query 
count(fruit_summary, "origin") #for eg, summarise the number of fruits of each origin 

所以我的主要問題是:這怎麼可以更優雅地表達(即一條線而不是3條)?其次:爲什麼它不允許我重命名列?

在此先感謝

+3

在鹼:'集合體(水果〜原點,合併(水果,fruit_class),FUN =長度)'或dplyr:'水果%>%left_join(fruit_class)%>%計數(原點)' – alistaire

+1

你基本代碼告訴我,亞洲有12種水果,新幾內亞有4種水果,所以它總結了水果$商店專欄(我不想使用)。結果應該是來自亞洲的3個水果(蘋果,香蕉和桔子)和一個來自新幾內亞(梨)。 – setbackademic

+0

我得到7和1,但如果你只是想從'fruit_class'數出來,使用'count(fruit_class,origin)'。如果你想確保它們在'fruits'中,那麼使用'fruit_class%>%semi_join(fruits)%>%count(origin)',在這種情況下它會返回相同的結果。也不是總結「商店」;他們正在計數行。 – alistaire

回答

0

簡單地做

table(fruit_class$fruit, fruit_class$origin) 

給你

 asia newguinea 
apple  1   0 
banana 1   0 
orange 1   0 
pear  0   1 

您可以colSums()加起來區域號碼。我想不出fruits數據幀是需要的原因,因爲如果這裏的水果不在fruit_class中,則無論如何都沒有原始數據。

順便說一句,在你的代碼示例中,colnames(fruit)[1] <- "fruit"應該可以工作,但只需要colnames(fruit) <- "fruit",因爲無論如何colname只有1個元素長。

0

這是一個data.table解決方案。

library(data.table) 
setDT(fruit_class)[, uniqueN(fruit), by=type] 
#  type V1 
# 1: pome 2 
# 2: berry 1 
# 3: citrus 1 

setDT(fruit_class)[, uniqueN(fruit), by=origin] 
#  origin V1 
# 1:  asia 3 
# 2: newguinea 1