在R中合并数据帧的优雅方式?

时间:2016-10-25 05:31:13

标签: r dataframe plyr summarize

我想获取数据框的唯一行,然后将其与另一行属性连接。我希望能够计算出品种的数量,例如:特定类型或来源的独特水果数量。

第一个数据框有我的水果列表:

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行)? 其次:为什么它不允许我重命名专栏?

提前致谢

2 个答案:

答案 0 :(得分:0)

简单地做

colSums()

给你

fruits

您可以使用fruit_class添加区号。我想不出需要colnames(fruit)[1] <- "fruit"数据框的原因,因为如果这里有一个水果不在colnames(fruit) <- "fruit"中,那么无论如何都没有原始数据。

顺便说一句,在您的代码示例中,{{1}}应该有效,但只需要{{1}},因为无论如何,这些名称的长度只有1个元素。

答案 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