如何将重复值分组为单个值,并在R中提取与该列值关联的值?
我有一个数据框,看起来是这样的:如何将重复值分组为单个值,并在R中提取与该列值关联的值?,r,dataframe,group-by,subset,R,Dataframe,Group By,Subset,我有一个数据框,看起来是这样的: df <- data.frame( Location = c("buildinga", "buildinga", "buildinga", "buildingb", "buildingb", "buildingb", "buildingc", "buildingc", "buildingc), Category = c(candy, candy, snacks, candy, snacks, soda, soda, candy, soda)
df <- data.frame(
Location = c("buildinga", "buildinga", "buildinga", "buildingb", "buildingb", "buildingb", "buildingc", "buildingc", "buildingc),
Category = c(candy, candy, snacks, candy, snacks, soda, soda, candy, soda)
Calories = 200, 250, 150, 180, 200, 80, 140, 200, 210)
)
df使用dplyr
,您可以根据您的数据分组,并计算每个类别中的卡路里
库(dplyr)
df%>%
分组依据(地点、类别)%>%
总结(计数=总和(卡路里))
#一个tibble:7x3
#分组:地点[3]
位置类别计数
1号楼A candy 450
2楼A小吃150
3号楼B candy 180
4楼B小吃200
5楼B苏打80
6号楼C candy 200
7楼C苏打350
这就是你要找的吗
数据
您的数据示例存在一些输入错误问题,以下是我使用的示例:
df我们可以使用base R
找到按其他列分组的“卡路里”的总和
aggregate(Calories ~ ., df, FUN = sum)
# Location Category Calories
#1 buildinga candy 450
#2 buildingb candy 180
#3 buildingc candy 200
#4 buildinga snacks 150
#5 buildingb snacks 200
#6 buildingb soda 80
#7 buildingc soda 350
数据
df嗨,听起来你想要这样的东西:
df %>% group_by(Location, Category) %>% summarise(total_cal = sum(Calories))
这是长格式,我想你会选择宽格式
df %>% spread(key = Category, value = total_cal, fill = 0)
如果需要,也可以将其转置。预期输出是什么。你的例子给了我错误。请修正它可能df%>%group\u by(Location)%>%summary(count=n\u distinct(Category))
Perfect,而不是sum如果我想从所有产品中找到卡路里含量最高的产品,我会使用max吗?我的目标是按性能(最差/最好的性能、每栋建筑的成本等)对产品进行分组。@Dinho,当然,你可以用max
替换sum
如果你想要每组产品的最大值,你也可以通过做summary(Count=sum(carries),max=max(carries))
来获得这两种产品。请参阅@akrun在他的回答中的评论,它将为您提供理想的输出完美,而不是总和如果我想从所有产品中找到热量最多的产品,我会使用max吗?我的目标是按性能(最差/最好的性能、每栋建筑的成本等)对产品进行分组。@Dinho如果你需要分组,那么,cut
可能会更好(df,ave(卡路里、位置、类别、乐趣=功能(x)cut(x,breaks=3,labels=c(“最差”、“中等”、“最佳”))
@Dinho或使用dplyr
df%>%groupby(地点、类别)%%>%mutate(分组=削减(卡路里、休息=3,标签=c(“最差”、“中等”、“最佳”))
谢谢@akrun。你认为最糟糕、最温和、最好的因素是什么?另外,是否有一种方法可以将所有建筑a组合成一个建筑值?基本上,每个组(a、b或c)的多个建筑值表示楼层。如果我只需要建筑物的全局平均值、最大值和最小值(考虑每层),我将如何重新格式化df以获得该值?我似乎不明白。@Dinho你可以通过平均值、最大值、最小值的休息时间,即df%>%groupby(地点、类别)%%>%mutate(group=cut(卡路里、休息时间=c(最小(卡路里)、平均(卡路里)、最大(卡路里)),labels=c(“最差”、“中等”、“最佳”)
df %>% spread(key = Category, value = total_cal, fill = 0)