用R计算平均值

时间:2012-03-21 06:59:08

标签: r

我有数据,我想计算一些统计数据。 数据的组织方式使得我有一个对应于每个3元素元组的值 像

这样的东西
(P1,M1,R1,V1)
(P1,M1,R2,V2)
(P1,M2,R1,V1)
...

此处P1,M1和R1不是数字,而是V1和V2。 现在我将数据放在csv文件中,x2.cvs如下:

P,M,R,V
P1,M1,R1,V1
P1,M1,R2,V2
...

我使用

读取数据
d = read.table("x2.csv", sep=",", header=TRUE)

但之后我不知道如何处理数据。

我想从计算简单信息开始: P的每个元素的平均值是多少(因此平均值将超过所有元素 M和R),或{P,M}的每对元素(因此这里的平均值将超过R的元素。

接下来我想做一些更复杂的事情,比如计算P1的元素数量是否超过某个指定值。

2 个答案:

答案 0 :(得分:6)

这是一个开始,有data.tableplyr和基本功能,还有很多其他方法......

首先,一些示例数据......

dput(examp)
structure(list(P = structure(c(1L, 1L, 1L, 2L), .Label = c("P1", 
"P2"), class = "factor"), M = structure(c(1L, 1L, 2L, 2L), .Label = c("M1", 
"M2"), class = "factor"), R = structure(c(1L, 2L, 1L, 1L), .Label = c("R1", 
"R2"), class = "factor"), V = c(23, 49, 24, 29)), .Names = c("P", 
"M", "R", "V"), row.names = c(NA, -4L), class = "data.frame")
#
# to give something like what you have...
#
examp
   P  M  R  V
1 P1 M1 R1 23
2 P1 M1 R2 49
3 P1 M2 R1 24
4 P2 M2 R1 29

以下是使用data.table的一种方法。如果您的数据对象非常大,您会发现data.table包非常快,文档也很出色:http://datatable.r-forge.r-project.org/datatable-intro.pdf

# What is the average of each element of P?
library(data.table)
examp.dt <- data.table(examp)
setkey(examp.dt,P)
examp.dt[,mean(V),by=P]
      P V1
[1,] P1 32
[2,] P2 29
#

另一个使用plyr

# What is the average of each element of P?
library(plyr)
ddply(examp, "P", function(df)mean(df$V))
P V1
1 P1 32
2 P2 29

另一个使用基础R

# What is the average of each element of P?
# for example using the by() function,  tapply() would be similar
with(examp, by(examp, P, mean))
P: P1
P  M  R  V 
NA NA NA 32 
------------------------------------------------- 
P: P2
P  M  R  V 
NA NA NA 29
#
# What is the average of each element of R? 
with(examp, by(examp, R, mean))
R: R1
P        M        R        V 
NA       NA       NA 25.33333 
----------------------------------------------
R: R2
P  M  R  V 
NA NA NA 49 
#
# the same, using tapply
with(examp, tapply(V, R, mean)
  R1       R2 
25.33333 49.00000

对于您的上一个问题,P1的元素数量多于某个指定值,我们可以像subset那样使用:

# how many elements of P1 are greater than 20?
nrow(subset(examp, examp$P=="P1" & examp$V>20))
[1] 3

或者甚至仅[获得相同结果且输入较少的内容:

nrow(examp[examp$P=="P1" & examp$V>20,])
[1] 3

答案 1 :(得分:5)

aggregate函数可能是您最容易使用的函数:

1) P 的每个元素的平均值是多少?

aggregate(formula = V ~ P, data = d, FUN = mean)

2)或{P,M} 的每对元素?

aggregate(formula = V ~ M + R, data = d, FUN = mean)

3) P1的元素数量多于某个指定值

aggregate(formula = V ~ P, data = d, FUN = function(x)sum(x > 10))