【发布时间】:2017-03-07 00:49:11
【问题描述】:
我想获取数据框的唯一行,然后将其与另一行属性连接。然后我希望能够计算品种的数量,例如特定类型或来源的独特水果的数量。
第一个数据框有我的水果列表:
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 行)? 其次:为什么不允许我重命名列?
提前致谢
【问题讨论】:
-
在基地:
aggregate(fruit ~ origin, merge(fruits, fruit_class), FUN = length)或 dplyr:fruits %>% left_join(fruit_class) %>% count(origin) -
您的基本代码告诉我有 12 个来自亚洲的水果和 4 个来自新几内亚的水果,所以它总结了 fruits$shop 列(我不想使用)。结果应该是 3 种来自亚洲的水果(苹果、香蕉和橙子)和一种来自新几内亚(梨)的水果。
-
我得到 7 和 1,但如果您只想计算来自
fruit_class的来源,请使用count(fruit_class, origin)。如果您想确保它们首先在fruits中,请使用fruit_class %>% semi_join(fruits) %>% count(origin),在这种情况下它将返回相同的内容。也不是求和shop;他们在计算行数。 -
另见 count aggregation 和 joining 的规范帖子。
标签: r dataframe plyr summarize