R语言 如何聚合具有不同功能的不同列

6uxekuva  于 2023-04-27  发布在  其他
关注(0)|答案(3)|浏览(146)

我有一个数据集,看起来像这样

df

ID size product   x    y 
A   1     abc    0.3   5
B   1     abc    0.8   7
C   1     abc    0.5   2
D   3     def    0.6   1

我想把x和mean相加,y和sum相加
所以用求和的方式聚合两者的代码如下所示
df1<-aggregate(list(x=df$x, y=df$y), by=list(df$size), FUN="sum")
我如何更改该代码以获得这样的数据集:

df2

size     x     y 
 1      0.53   14
 3      0.6    1

先谢谢你了

iibxawm4

iibxawm41#

一个选项是collap from collapse

library(collapse)
collap(slt(df, -ID, -product), ~ size, custom = list(fmean = 'x', fsum = 'y'))
#  size         x  y
#1    1 0.5333333 14
#2    3 0.6000000  1

注意:我们可以在list中有一系列列,即

collap(slt(df, -ID, -product), ~ size, custom = list(fmean = 2:3))
#  size         x        y
#1    1 0.5333333 4.666667
#2    3 0.6000000 1.000000

或者使用mtcars数据

collap(mtcars, ~ cyl, custom = list(fmean = c(1, 3:5),
          fsum = c(6, 7), fmedian = 8:9))
#       mpg cyl     disp        hp     drat     wt   qsec vs am
#1 26.66364   4 105.1364  82.63636 4.070909 25.143 210.51  1  1
#2 19.74286   6 183.3143 122.28571 3.585714 21.820 125.84  1  0
#3 15.10000   8 353.1000 209.21429 3.229286 55.989 234.81  0  0

return可以是listlong_dupllongwide

collap(mtcars, ~ cyl, custom = list(fmean = c(1, 3:5), 
       fsum = c(6, 7), fmedian = 8:9), return = "list")

如果我们想对不同的列使用多个函数,一个选项是通过mergelist元素循环到一个汇总输出,从而使用MapReduce进行循环

Reduce(function(...) merge(..., by = 'size'), 
  Map(function(u, v) aggregate(reformulate('size', response = v), df,
      FUN = match.fun(u)), c('mean', 'sum'), c('x', 'y')))
#  size         x  y
#1    1 0.5333333 14
#2    3 0.6000000  1

数据

df <- structure(list(ID = c("A", "B", "C", "D"), size = c(1L, 1L, 1L, 
3L), product = c("abc", "abc", "abc", "def"), x = c(0.3, 0.8, 
0.5, 0.6), y = c(5L, 7L, 2L, 1L)), class = "data.frame", row.names = c(NA, 
-4L))
0tdrvxhp

0tdrvxhp2#

在处理这种性质的 Dataframe 时,我会使用tidyverse包中的summarise()函数。这允许您对一组多个不同的方程进行总结。我已经演示了我期望的解决方案。

df %>%
  group_by(size) %>%
  summarise(
    x = mean(x),
    y = sum (y)
  )

基础解决方案需要不同的方法。

oxcyiej7

oxcyiej73#

SSBtools包中的函数aggregate_multiple_funaggregate的 Package 器,它允许多个函数和多个变量的函数。
在这种情况下,可能性是

library(SSBtools)
aggregate_multiple_fun(df, by = df["size"], vars = c(mean = "x", sum = "y"))

然后,输出变量名将是x_meany_sum。对于名称为xy

aggregate_multiple_fun(df, by = df["size"], 
                   vars = list(x = list(mean = "x"), 
                               y = list(sum = "y")))

要使用na.rmmeansum的参数,必须将额外的参数设置为TRUE

aggregate_multiple_fun(df, by = df["size"], 
                   vars = c(mean = "x", sum = "y"), 
                   forward_dots = TRUE, 
                   dots2dots = TRUE, 
                   na.rm = TRUE)

转发额外的参数可能是一个陷阱,因此默认情况下不会这样做。forward_dots参数是必需的,在mean的情况下,dots2dots也是必需的。

相关问题