为什么函数不适用于ave函数

时间:2015-09-03 11:51:26

标签: r dataframe

我想添加一个新的计算列" new"这将具有"蛇的平均值"每个区域。我尝试使用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

这是用均值函数替换sum函数时得到的错误:

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

1 个答案:

答案 0 :(得分:2)

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我们{'1}}'区域'列中的'蛇',获取split mean,复制它snakes元素的length和'区'的list

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 dplyr

使用data.table,我们按'区'分组,并使用dplyr创建'avg'列。

mutate

我们将'data.frame'转换为'data.table'(library(dplyr) df %>% group_by(area) %>% mutate(avg= mean(snakes)) ),按'area'分组,我们分配(setDT(df))'{1}}'snakes'作为'avg'专栏。

:=