我有一个数据框,比如:

x <-
id1 id2    val1  val2 val3 val4
1   a   x    1    9
2   a   x    2    4
3   a   y    3    5
4   a   y    4    9
5   b   x    1    7
6   b   y    4    4
7   b   x    3    9
8   b   y    2    8

我希望通过id1&amp;id2.我希望能同时得到val1,val2,val3,val4的方法.

我该怎么做?

这是我目前拥有的,但它只适用于1个专栏:

agg <- aggregate(x$val1, list(id11 = x$id1, id2= x$id2), mean)
names(agg)[3] <- c("val1")  # Rename the column

此外,如何重命名在上述同一语句中作为平均值输出的列

推荐答案

我们可以使用aggregate的公式法.~的"rhs"上的变量是分组变量,而.代表"df1"中的所有其他变量(从示例中,我们假设除了分组之外的所有列都需要mean),指定数据集和函数(mean).

aggregate(.~id1+id2, df1, mean)

或者我们可以在分组后使用dplyr中的summarise_each(group_by)

library(dplyr)
df1 %>%
    group_by(id1, id2) %>% 
    summarise_each(funs(mean))

或者使用summariseacross(dplyr-devel版本-‘0.8.99.9000’)

df1 %>% 
    group_by(id1, id2) %>%
    summarise(across(starts_with('val'), mean))

或者另一个选项是数据.table.我们转换数据.帧"到"数据.表(setDT(df1),按'id1'和'id2'分组),我们循环遍历数据.table(.SD)的子集,得到mean.

library(数据.table)
setDT(df1)[, lapply(.SD, mean), by = .(id1, id2)] 

数据

df1 <- structure(list(id1 = c("a", "a", "a", "a", "b", "b", 
"b", "b"
), id2 = c("x", "x", "y", "y", "x", "y", "x", "y"), 
val1 = c(1L, 
2L, 3L, 4L, 1L, 4L, 3L, 2L), val2 = c(9L, 4L, 5L, 9L, 7L, 4L, 
9L, 8L)), .Names = c("id1", "id2", "val1", "val2"), 
class = "数据.frame", row.names = c("1", 
"2", "3", "4", "5", "6", "7", "8"))

R相关问答推荐

修改dDeliverr中列表列的最后一个元素

self_函数无法工作--无法子集结束后的列

多个ggpredicate对象的平均值

如何在四进制仪表板值框中显示值(使用shiny 的服务器计算)

从多个前置日期中获取最长日期

将嵌套列表子集化为嵌套列表

错误:非常长的R行中出现意外符号

R s iml包如何处理语法上无效的因子级别?'

如何在Chart_Series()中更改轴值的 colored颜色 ?

将包含卷的底部25%的组拆分为2行

为什么我的基准测试会随着样本量的增加而出现一些波动?

R中1到n_1,2到n_2,…,n到n_n的所有组合都是列表中的向量?

为左表中的所有行使用值Fill滚动左连接

正在导出默认的RStudio主题,还是设置括号 colored颜色 ?

按组计算列中1出现的间隔年数

如何将这个小列表转换为数据帧?

如何删除设置大小的曲线图并添加条形图顶部数字的百分比

基于R中的辅助向量中的值有条件地连接向量中的字符串

通过R:文件名未正确写入[已解决]将.nc文件转换和导出为.tif文件

如何使用ggplot2根据绘图中生成的斜率对小平面进行排序?