为什么mean函数不能与ave函数一起使用?

3
我想添加一个新的计算列"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

2
我无法在R版本3.2.2中重现这个错误。 你在干净的R会话中运行了这段代码吗? - user3710546
2
你不需要指定 mean,因为默认情况下 ave(df$snakes, df$area) 会给出 mean。你尝试过 library(dplyr);df %>% group_by(area) %>% mutate(avg= mean(snakes)) 或者 library(data.table); setDT(df)[, avg:= mean(snakes), area] 吗? - akrun
1
感谢 @akrun 提供的其他解决方案。 - mql4beginner
1
尝试使用unsplit(lapply(split(df$snakes, df$area), function(x) rep(mean(x),length(x))), df$area)进行操作。 - akrun
1
@akrun,您可以将dplyrlapply + split的替代方案发布为答案。 - user3710546
显示剩余11条评论
1个回答

2
ave工作于R 3.2.2R 3.1.0(根据@Pascal的评论),以及R studio版本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,我们通过 'area' 列将 'snakes' 进行分割,获取 snakesmean,并将其复制到 list 元素的 length,然后通过 'area' 进行 unsplit

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,我们按 'area' 进行分组,并使用 mutate 创建 'avg' 列。
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]

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接