分组的n列的sqldf平均

时间:2019-09-02 09:58:05

标签: r sqldf

Id希望获得R数据帧上使用sql查询的n(许多)列的分组平均值。 单个列的工作方式如下。但是,我想在所有列上执行该语句,而无需明确说明它们。

例如,我尝试过的是:

sqldf('SELECT some_ID, other_ID, AVG(colnames(data_frame_name) FROM data_frame_name GROUP BY some_ID, other_ID') 

sqldf('SELECT some_ID, other_ID, AVG(column_name) FROM data_frame_name GROUP BY some_ID, other_ID')

2 个答案:

答案 0 :(得分:0)

我不确定是否可以使用纯SQL来解决它,如果SQL可以解决,sqldf可以提供帮助。

但是R还有许多其他工具,例如dplyr中的tidyverse。 下面的代码可以完成这项工作。您将some_ID和other_ID放入“ group_by”,并具有所有数字列的均值。

library(tidyverse)

mtcars %>% 
  group_by(cyl) %>% 
  summarise_all( mean)

答案 1 :(得分:0)

使用内置的anscombe数据集,我们添加了一个id列 然后在接下来的两行中生成选择子句sel。 最后,我们运行sqldf。如果您将verbose=TRUE参数添加到sqldf 想查看显示的最终SQL语句。

library(sqldf)

anscombe$id <- rep(1:2, c(5, 6)) # test data

Names <- setdiff(names(anscombe), "id")  # names excluding id
sel <- toString(sprintf("avg(%s) as %s", Names, Names))
fn$sqldf("select id, $sel from anscombe group by id")

给予:

  id   x1   x2   x3       x4       y1   y2       y3    y4
1  1 10.2 10.2 10.2 8.000000 7.942000 8.81 8.378000 7.472
2  2  8.0  8.0  8.0 9.833333 7.133333 6.41 6.768333 7.525

汇总

请注意,在基数R中可以这样进行:

aggregate(. ~ id, anscombe, mean)

给予:

  id   x1   x2   x3       x4       y1   y2       y3    y4
1  1 10.2 10.2 10.2 8.000000 7.942000 8.81 8.378000 7.472
2  2  8.0  8.0  8.0 9.833333 7.133333 6.41 6.768333 7.525