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')
答案 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