我在R中有一个名为food的数据框:
foodID calories fat protein
123 0.5 0.4 0.9
432 0.65 0.3 0.7
123 0.32 0.6 0.5
983 0.82 0.2 0.6
并且我正在尝试通过 foodID 对卡路里和蛋白质列进行平均。
我尝试过:
cal_pro <- aggregate(food[2,4], list(food$foodID), function(df) mean(df))
但是看来我无法选择food [2,4]来应用均值函数的列?谁能帮我这个忙。
答案 0 :(得分:1)
使用dplyr
,您可以只group_by
和summarize
:
food %>%
group_by(foodID) %>%
summarize(calories_average = mean(calories),
protein_average = mean(protein))
# A tibble: 3 x 3
foodID calories_average protein_average
<int> <dbl> <dbl>
1 123 0.41 0.7
2 432 0.65 0.7
3 983 0.82 0.6
您可以使用summarize_at
选择多个变量来一次汇总,而不必指定每个变量。我们传入两个参数:要汇总的变量和要应用到它们的函数列表。如果列表是按名称命名的,则该名称将作为后缀添加到摘要列(给出“ calores_average”和“ protein_average”:
food %>%
group_by(foodID) %>%
summarize_at(c('calories', 'protein'), list(average = mean))
summarize_at
还允许您使用各种辅助函数来按前缀,后缀或正则表达式选择变量(如下所示)。您可以在这里了解有关它们的更多信息:?tidyselect::select_helpers
food %>%
group_by(foodID) %>%
summarize_at(vars(matches('calories|protein')), list(average = mean))
答案 1 :(得分:0)
我们可以使用公式方法
aggregate(cbind(calories, protein) ~ foodID, food, mean)
或者使用OP的代码,它应该是c(2,4),因为如果我们进行2, 4
,它将按行/列索引选择第4列的第2行
aggregate(food[c(2, 4)], list(food$foodID), mean)
编辑:基于@RuiBarradas评论
答案 2 :(得分:0)
您可以使用data.table
软件包-
> setDT(dt)[,list(avg_calorie=mean(calories),avg_protein=mean(protein)),by=foodID]
输出-
foodID avg_calorie avg_protein
1: 123 0.41 0.7
2: 432 0.65 0.7
3: 983 0.82 0.6