【问题标题】:Why mean function doesn't work with ave function为什么 mean 函数不适用于 ave 函数
【发布时间】:2015-09-03 11:51:25
【问题描述】:

我想添加一个新的计算列“new”,其中包含每个区域的“snakes”平均值。我尝试使用ave 函数,但它不适用于mean。我尝试使用sum 运行同一行,但它成功了,原因是什么,还有其他方法可以获得所需的结果。

这是我的玩具数据框:

df <- read.table(text = "snakes birds    wolfs     area
                            3        9         7 a
                            3        8         4 b
                            1        2         8 c
                            1        2         3 a
                            1        8         3 a
                            6        1         2 a
                            6        7         1 b
                            6        1         5 c   ",header = TRUE)

这是代码的工作行:

df$sum <- ave(df$snakes, df$area, FUN=sum)
df
  snakes birds wolfs area sum
1      3     9     7    a   11
2      3     8     4    b    9
3      1     2     8    c    7
4      1     2     3    a   11
5      1     8     3    a   11
6      6     1     2    a   11
7      6     7     1    b    9
8      6     1     5    c    7

这是我用平均函数替换求和函数时遇到的错误:

df$avg <- ave(df$snakes, df$area, FUN=mean)
Error in get(as.character(FUN), mode = "function", envir = envir) : 
  object 'FUN' of mode 'function' was not found

【问题讨论】:

  • 我无法在 R 版本 3.2.2 中复制此错误。您是否在 R 的干净会话中运行此代码?
  • 你不需要将mean指定为ave(df$snakes, df$area)默认给mean你试过library(dplyr);df %&gt;% group_by(area) %&gt;% mutate(avg= mean(snakes))library(data.table); setDT(df)[, avg:= mean(snakes), area]
  • 感谢@akrun,我在另一台使用 R 3.1.2 的机器上运行它,它运行良好。
  • 感谢其他解决方案@akrun..
  • 你可以在 split 之后使用 lapply by 'area'

标签: r dataframe


【解决方案1】:

ave 适用于R 3.2.2R 3.1.0(基于@Pascal 的评论)和R studio version 0.99.467。因此,我们不确定错误背后的真正原因。至于mean,我们不需要明确指定,因为

ave(df$snakes, df$area)
#[1] 2.75 4.50 3.50 2.75 2.75 2.75 4.50 3.50

base R 替代方案是split/unsplit,其中我们split 'area' 列旁边的'snakes',得到snakesmean,将其复制到length 元素的lengthunsplit'区域'

unsplit(lapply(split(df$snakes, df$area), 
        function(x) rep(mean(x),length(x))), df$area)
#[1] 2.75 4.50 3.50 2.75 2.75 2.75 4.50 3.50

如果我们可以安装其他包,我们可以使用dplyrdata.table

使用dplyr,我们按“区域”分组,并使用mutate 创建“平均”列。

library(dplyr)
df %>%
   group_by(area) %>% 
   mutate(avg= mean(snakes))

我们将 'data.frame' 转换为 'data.table' (setDT(df)),按 'area' 分组,我们将 (:=) 'snakes' 的 mean 分配为 'avg' 列.

library(data.table)
setDT(df)[, avg:= mean(snakes), by = area]

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-10-29
    • 1970-01-01
    • 2018-08-30
    • 2023-03-25
    • 1970-01-01
    • 1970-01-01
    • 2011-10-18
    相关资源
    最近更新 更多