按级别平均值

Bar*_*iak 15 r mean levels factors

也许这很简单,但我无法在网上找到答案.我按平均因素按平均计算有问题.我的数据看起来很典型:

factor, value
a,1
a,2
b,1
b,1
b,1
c,1
Run Code Online (Sandbox Code Playgroud)

我想得到向量A包含只有级别"a"的意思如果我在consol上键入A我想得到1.5而这种计算方法的方法,必须使用因子.

提前感谢您的帮助.

JPC*_*JPC 28

看看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
Run Code Online (Sandbox Code Playgroud)

您可以使用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
Run Code Online (Sandbox Code Playgroud)

您也可以使用dlply(它采用数据帧并返回列表)

> dlply(dat, .(factor), summarize, mean=mean(value))$a
       mean
1 0.3877001
Run Code Online (Sandbox Code Playgroud)


小智 7

以下代码要求因子 = a 时的平均值:

mean(data$value[data$factor == "a"])
Run Code Online (Sandbox Code Playgroud)


Dav*_*urg 6

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

library(data.table) 
A <- setDT(df)[factor == "a", mean(value)]
## [1] 1.5
Run Code Online (Sandbox Code Playgroud)

  • R 是一种真正奇异的编程语言。 (6认同)
  • @duhaime这是做一些非常简单的事情的非常愚蠢的方式。我刚加入时就发回了这个,并且非常渴望代表。如果可以,我会一起删除这个答案。顺便说一句,评论中的解决方案对您来说也很奇怪吗?你能找到比 Python 中的 `aggregate(value~factor, FUN=mean)` 更不奇怪的东西吗(更不用说 Pandas 从 R 中复制了所有东西)。 (2认同)

Rue*_*ege 6

Another simple possibilty would be the "by" function:

by(value, factor, mean)
Run Code Online (Sandbox Code Playgroud)

You can get the mean of factor level "a" by:

factor_means <- by(value, factor, mean)
factor_means[attr(factor_means, "dimnames")$factor=="a"]
Run Code Online (Sandbox Code Playgroud)