我想将tapply
结果添加到原始数据框作为新列。
这是我的数据框:
dat <- read.table(text = " category birds wolfs snakes
yes 3 9 7
no 3 8 4
no 1 2 8
yes 1 2 3
yes 1 8 3
no 6 1 2
yes 6 7 1
no 6 1 5
yes 5 9 7
no 3 8 7
no 4 2 7
notsure 1 2 3
notsure 7 6 3
no 6 1 1
notsure 6 3 9
no 6 1 1 ",header = TRUE)
我想将每个类别的平均值作为列添加到数据框中。
我使用:tapply(dat$birds, dat$category, mean)
来获取每个类别的平均值,但我没有找到将其添加到数据集的方法,以至于在新列中我会得到相关的平均值类别。
答案 0 :(得分:6)
您可以使用ave
base
dat$mbirds <- with(dat, ave(birds, category, FUN=mean))
如果您想使用tapply
mbirds1 <- with(dat, tapply(birds, category, mean))
dat$mbirds1 <- mbirds1[match(dat$category,names(mbirds1))]
head(dat)
# category birds wolfs snakes mbirds mbirds1
#1 yes 3 9 7 3.200 3.200
#2 no 3 8 4 4.375 4.375
#3 no 1 2 8 4.375 4.375
#4 yes 1 2 3 3.200 3.200
#5 yes 1 8 3 3.200 3.200
#6 no 6 1 2 4.375 4.375
或者您可以使用data.table
快速
library(data.table)
setDT(dat)[,mbirds1:= mean(birds), by=category]
答案 1 :(得分:3)
这是一个aggregate
答案。在其参数中使用公式使其变得简单明了。
> a <- aggregate(birds~category, dat, mean)
> cb <- cbind(dat, mean = a[,2][match(dat[[1]], a[,1])])
> head(cb)
# category birds wolfs snakes mean
#1 yes 3 9 7 3.200
#2 no 3 8 4 4.375
#3 no 1 2 8 4.375
#4 yes 1 2 3 3.200
#5 yes 1 8 3 3.200
#6 no 6 1 2 4.375
答案 2 :(得分:1)