【问题标题】:Multiplication in FUN argumentFUN 参数中的乘法
【发布时间】:2022-01-23 19:56:22
【问题描述】:

我有这个数据框

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 字节之类的东西来相乘

【问题讨论】:

  • * 只乘以 2 个值。您正在寻找 产品FUN = prod
  • 虽然在这里不是一个因素,即使* 是在这里使用的正确函数(即,每个组/数据两行),那么您仍然需要将其包装在反引号中,这对所有人都是必要的R中的中缀运算符。您需要执行FUN = `*`(尽管由于GregorThomas在他们的答案中突出显示并修复了原因,这仍然不起作用)。

标签: r aggregate-functions multiplication


【解决方案1】:

+ 对应于sum,就像* 对应于prod(对于产品)。

您的样本数据遵循data.frame(matrix()) 的反模式。一个矩阵只能有一种数据类型。你在矩阵中混合字符和数字数据,矩阵使它成为character 类,你不能对字符进行数学运算。这是正确的示例数据和解决方案的演示。另请注意,使用 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

【讨论】:

    【解决方案2】:

    使用 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)
    

    【讨论】:

      猜你喜欢
      • 2017-06-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多