2016-10-25 24 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