如何计算R中2个组变量的特定范围的统计数据?

时间:2014-06-24 12:20:37

标签: r dataframe

我有点问题。

我有一列数据(P),我想分析(平均值,标准差等)并绘制另一列(频率)。数据集的示例如下所示。

Frequency Voltage P
20000     10      0.12
20000     10      0.23
20000     10      0.51
20000     20      0.45
20000     20      0.01
20000     20      0.94  
30000     10      0.66
30000     10      0.36
30000     10      0.18
30000     20      0.05
30000     20      0.15
30000     20      0.83

我遇到的问题是计算P的范围的平均值,例如,频率= 20000 AND电压= 10.

大多数示例只使用一个组,如下所示:

by(df$P, df$Frequency, mean)

有没有办法计算它,以便数据框变为:

Frequency Voltage P(average)
20000     10      ...
20000     20      ...
30000     10      ...
30000     20      ...

修改

我设法找到了我需要的平均值和标准偏差:

df$mean<-ave(df$P, df$Voltage, df$Frequency, FUN=mean)
df$sd<-ave(df$P, df$Voltage, df$Frequency, FUN=sd)

但他们给了我重复的价值观。现在,有没有办法压缩所有这些,所以我只是得到上面的数据框?

4 个答案:

答案 0 :(得分:3)

使用aggregatelist表示法

尝试formula
# your data
df <- read.table(text="Frequency Voltage P
20000     10      0.12
20000     10      0.23
20000     10      0.51
20000     20      0.45
20000     20      0.01
20000     20      0.94  
30000     10      0.66
30000     10      0.36
30000     10      0.18
30000     20      0.05
30000     20      0.15
30000     20      0.83", header=TRUE)

# list notation
with(df, aggregate(P, list(Frequency=Frequency, Voltage=Voltage), FUN=mean))
#  Frequency Voltage         x
#1     20000      10 0.2866667
#2     30000      10 0.4000000
#3     20000      20 0.4666667
#4     30000      20 0.3433333

# formula notation
aggregate(P ~ Frequency + Voltage, data=df, FUN=mean)
#  Frequency Voltage         P
#1     20000      10 0.2866667
#2     30000      10 0.4000000
#3     20000      20 0.4666667
#4     30000      20 0.3433333

要将多个统计信息放在一起(例如meansd),您可以将结果合并在一起:

> cbind(aggregate(P ~ Frequency + Voltage, data=df, FUN=mean),
        sd = aggregate(P ~ Frequency + Voltage, data=df, FUN=sd)$P)
  Frequency Voltage         P        sd
1     20000      10 0.2866667 0.2010804
2     30000      10 0.4000000 0.2424871
3     20000      20 0.4666667 0.4652240
4     30000      20 0.3433333 0.4244212

或者,您可以编写自己的函数来返回值向量,但是您必须做一些额外的工作才能将结果存储在自己的列中:

> myfun <- function(x) c(mean(x), sd(x))
> x <- aggregate(P ~ Frequency + Voltage, data=df, FUN=myfun)
> x[,3:4] <- x[,3]
  Frequency Voltage         P        V4
1     20000      10 0.2866667 0.2010804
2     30000      10 0.4000000 0.2424871
3     20000      20 0.4666667 0.4652240
4     30000      20 0.3433333 0.4244212

答案 1 :(得分:3)

library(data.table)
setDT(df)[, list(Mean = mean(P), SD = sd(P)), by = list(Frequency, Voltage)]

##   Frequency Voltage      Mean        SD
##1:     20000      10 0.2866667 0.2010804
##2:     20000      20 0.4666667 0.4652240
##3:     30000      10 0.4000000 0.2424871
##4:     30000      20 0.3433333 0.4244212

答案 2 :(得分:3)

library(dplyr)
df%>% #?%>% chain multiple operations
group_by(Frequency,Voltage)%>% #group by variables `Frequency`, `voltage`
summarise(Mean=mean(P), SD=sd(P)) ##get the `mean` and `sd` of column `P` 

答案 3 :(得分:0)

要获得值的简单解决方案,请使用tapply:

with(df, tapply(P, list(Frequency, Voltage), mean))
             10        20
20000 0.2866667 0.4666667
30000 0.4000000 0.3433333

with(df, tapply(P, list(Frequency, Voltage), sd))
             10        20
20000 0.2010804 0.4652240
30000 0.2424871 0.4244212

For loop&amp; cat命令可用于根据需要格式化输出:

for(x in unique(df$Voltage)) 
    for(y in unique(df$Frequency))  {
        cat("Voltage=",x,"; Frequency=",y,"; Mean P=");
        cat(mean(df[df$Voltage==x & df$Frequency==y,]$P))
        cat("; SD=",sd(df[df$Voltage==x & df$Frequency==y,]$P),"\n")
    }

Voltage= 10 ; Frequency= 20000 ; Mean P=0.2866667; SD= 0.2010804 
Voltage= 10 ; Frequency= 30000 ; Mean P=0.4; SD= 0.2424871 
Voltage= 20 ; Frequency= 20000 ; Mean P=0.4666667; SD= 0.465224 
Voltage= 20 ; Frequency= 30000 ; Mean P=0.3433333; SD= 0.4244212