在R中合并数据帧的优雅方式?
问题描述:
我想获取数据框的唯一行,然后将其与另一行属性进行连接。然后,我希望能够计算品种的数量,例如特定类型或来源的独特水果的数量。在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条)?其次:为什么它不允许我重命名列?
在此先感谢
答
简单地做
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个元素长。
答
这是一个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
在碱:'集合体(水果〜原点,合并(水果,fruit_class),FUN =长度)'或dplyr:'水果%>%left_join(fruit_class)%>%计数(原点)' – alistaire
你基本代码告诉我,亚洲有12种水果,新几内亚有4种水果,所以它总结了水果$商店专栏(我不想使用)。结果应该是来自亚洲的3个水果(苹果,香蕉和桔子)和一个来自新几内亚(梨)。 – setbackademic
我得到7和1,但如果你只是想从'fruit_class'数出来,使用'count(fruit_class,origin)'。如果你想确保它们在'fruits'中,那么使用'fruit_class%>%semi_join(fruits)%>%count(origin)',在这种情况下它会返回相同的结果。也不是总结“商店”;他们正在计数行。 – alistaire