FUN 参数中的乘法

Multiplication in FUN argument

我有这个数据框

x <- data.frame(
        matrix(
          c(letters[1:3], c("x", "x", "y") ,
          sample(c(rep(1,100),0), size = 1),
          sample(c(rep(1,100),0), size = 1),
          sample(c(rep(1,100),0), size = 1)), ncol = 3)
)

我想按组 X 和 Y 做乘法。

我的建议

agg <- aggregate(x$X3,
                 by = list(x$X2),
                 FUN = *)

我想用 sum, mean byt 来乘

+ 之于 sum 如同 * 之于 prod(对于 product)。

您的示例数据遵循 data.frame(matrix()) 的反模式。一个矩阵只能有一种数据类型。你在矩阵中混合了字符和数字数据,矩阵使它全部 character class,你不能对字符进行数学运算。这是正确的示例数据和解决方案的演示。另请注意,使用 by = X["X2"] 而不是 by = list(x$X2) 会在结果中提供更好的列名。

(x <- data.frame(
          X1 = letters[1:3],
          X2 = c("x", "x", "y") ,
          X3 = 2:4
))
#   X1 X2 X3
# 1  a  x  2
# 2  b  x  3
# 3  c  y  4

aggregate(x$X3, by = x["X2"], FUN = prod)
#   X2 x
# 1  x 6
# 2  y 4

要么使用 prod,要么使用带 * 的 Reduce。还将 X3 转换为数字,并使用如图所示的单括号来保留名称。交替使用聚合公式方法,仅针对 prod 显示,但也适用于 Reduce。

xx <- transform(x, X3 = as.numeric(X3))

aggregate(xx["X3"], by = xx["X2"], FUN = prod)

aggregate(xx["X3"], by = xx["X2"], FUN = Reduce, f = `*`) # same

aggregate(X3 ~ X2, xx, FUN = prod)

更好的例子可能是使用 R 附带的 mtcars:

aggregate(mtcars["mpg"], by = mtcars["cyl"], FUN = prod)

aggregate(mtcars["mpg"], by = mtcars["cyl"], FUN = Reduce, f = `*`) # same

aggregate(mpg ~ cyl, mtcars, FUN = prod)