我有点问题。
我有一列数据(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)
但他们给了我重复的价值观。现在,有没有办法压缩所有这些,所以我只是得到上面的数据框?
答案 0 :(得分:3)
使用aggregate
或list
表示法
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
要将多个统计信息放在一起(例如mean
和sd
),您可以将结果合并在一起:
> 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