我想添加一个新的计算列" 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
答案 0 :(得分:2)
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
我们{'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'专栏。
:=