如何将tapply结果添加到现有数据框

时间:2014-09-01 11:18:04

标签: r dataframe tapply

我想将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)来获取每个类别的平均值,但我没有找到将其添加到数据集的方法,以至于在新列中我会得到相关的平均值类别。

3 个答案:

答案 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)

您可以使用此{/ 3>这样的dplyr软件包轻松实现这一目标

dat <- dat %>% group_by(category) %>% mutate(mbirds=mean(birds))

有关dplyr软件包的更多信息,请访问here

您可以在akrun的答案中找到其他包的方法。