22

也许这很简单,但我在网上找不到答案。我对逐级因子的平均计算有疑问。我的数据看起来很典型:

factor, value
a,1
a,2
b,1
b,1
b,1
c,1

我想得到向量 A 只包含级别“a”的平均值如果我在 consol 上键入 A 我想得到 1.5 而这种计算平均值的方法必须使用因子。

提前感谢您的帮助。

4

5 回答 5

34

看一下tapply,它可以让您根据因子分解向量并将函数应用于每个子集

> dat<-data.frame(factor=sample(c("a","b","c"), 10, T), value=rnorm(10))
> r1<-with(dat, tapply(value, factor, mean))
> r1
         a          b          c
 0.3877001 -0.4079463 -1.0837449
> r1[["a"]]
[1] 0.3877001

您可以使用r1[["a"]]等访问您的结果。

或者,流行的 R 包之一 ( plyr) 有很好的方法来做到这一点。

> library(plyr)
> r2<-ddply(dat, .(factor), summarize, mean=mean(value))
> r2
  factor       mean
1      a  0.3877001
2      b -0.4079463
3      c -1.0837449
> subset(r2,factor=="a",select="mean")
       mean
1 0.3877001

您也可以dlply改用(它接受一个数据框并返回一个列表)

> dlply(dat, .(factor), summarize, mean=mean(value))$a
       mean
1 0.3877001
于 2014-04-30T18:49:50.347 回答
7

以下代码在 factor = a 时询问平均值:

mean(data$value[data$factor == "a"])
于 2014-04-30T20:33:30.283 回答
6

只是为了好玩发布data.table解决方案,尽管您可能应该按照@lukeA 的建议做

library(data.table) 
A <- setDT(df)[factor == "a", mean(value)]
## [1] 1.5
于 2014-04-30T18:57:13.333 回答
6

另一个简单的可能性是“by”函数:

by(value, factor, mean)

您可以通过以下方式获得因子水平“a”的平均值:

factor_means <- by(value, factor, mean)
factor_means[attr(factor_means, "dimnames")$factor=="a"]
于 2017-03-13T14:10:58.153 回答
0

您可以使用ddply并将摘要作为函数传递。

library(plyr) # import library
ddply(nameOfTheDataframe, ~ factor, function(data) summary(data$value))
于 2022-02-28T12:05:19.257 回答