聚合R数据帧中的两列

聚合R数据帧中的两列,r,R,我在R中有一个称为食物的数据框: 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], lis

我在R中有一个称为食物的数据框:

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))

cal_pro我们可以使用公式法

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注释

您可以使用
数据表
包-

> 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

使用
dplyr
,您只需
group\u by
summary

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
summary_at
还允许您使用各种辅助函数按前缀、后缀或正则表达式选择变量(如下所示)。您可以在此处了解更多信息:
?tidyselect::select\u helpers

food %>%
    group_by(foodID) %>%
    summarize_at(vars(matches('calories|protein')), list(average = mean))

寻找更多的替代品我相信它应该是
c(2,4)
而不是
2:4
@akrun doing[2:4]将均值函数也应用于第三列,不是吗?这是否意味着我以后必须删除第三列?@Maxx抱歉,我以为你需要一系列columns@Maxxx您希望解决方案中还有其他内容吗。
food %>%
    group_by(foodID) %>%
    summarize_at(vars(matches('calories|protein')), list(average = mean))