我想添加一个新的计算列"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
最佳答案
ave
工作于 R 3.2.2
, R 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
“区域”列旁边的“蛇”,得到 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
,我们按“区域”分组,并使用 mutate
创建“avg”列.
library(dplyr)
df %>%
group_by(area) %>%
mutate(avg= mean(snakes))
我们将“data.frame”转换为“data.table”( setDT(df)
),按“区域”分组,我们分配( :=
) mean
“snakes”作为“avg”列。
library(data.table)
setDT(df)[, avg:= mean(snakes), by = area]
关于r - 为什么mean函数不能与ave函数一起使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32374841/