[英]Calculate the mean with a for loop in R
这就是我必须做的:使用 for 循环计算并存储每辆自行车的平均单圈时间。 下面的代码是我试图解决它的方法。 它给了我关于一些意外大括号的错误,我不知道为什么。 我必须使用 for 循环(没有 tidyverse 或任何其他包)。
racing <- data.frame(Bike=rep(c("A1", "A2", "A3"), times=4),
Lap=rep(c(1,2,3,4), each=3),
Time=c(71,70,67,73,72,66,68,74,69,68,68,70))
for(bike in racing){
if([racing$Bike=="A1",]){
time_mean <- mean(racing$Time)
}
else if([racing$Bike=="A2",]){
time_mean1 <- mean(racing$Time)
}
else{
time_mean2 <- mean(racing$Time)
}
}
lap_mean <- c(time_mean, time_mean1, time_mean2)
Error: unexpected '}' in " }"
这可以使用tapply
函数在一行中变得更简单:
> (lapmean<-tapply(racing$Time, racing$Bike, mean))
A1 A2 A3
70 71 68
更新:
我很清楚为什么我的帖子被否决了,因为它需要更少的输入并且比这里发布的任何其他程序更有效(与性能最差的代码相比效率高 22 倍)。 我运行了提交的所有其他代码的执行时间,以下是按经过时间(以秒为单位)按最佳到最差执行顺序排列的结果:
我们可以使用来自base R
aggregate
aggregate(Time ~ Bike, data = racing, FUN = mean)
-输出
# Bike Time
#1 A1 70
#2 A2 71
#3 A3 68
或者使用for
循环
unb <- unique(racing$Bike)
out <- c()
for(bike in unb) {
out <- c(out, mean(subset(racing, Bike == bike, select = Time)$Time))
}
setNames(out, unb)
# A1 A2 A3
# 70 71 68
尝试这个。 您可以创建一个向量来存储自行车,然后使用subset()
遍历它来过滤数据并计算平均时间。 这里的代码:
#Data
racing <- data.frame(Bike=rep(c("A1", "A2", "A3"), times=4),
Lap=rep(c(1,2,3,4), each=3),
Time=c(71,70,67,73,72,66,68,74,69,68,68,70),stringsAsFactors = F)
#Bikes
vb <- unique(racing$Bike)
#Loop
vmeans <- numeric(length(vb))
for(i in 1:length(vb))
{
#Data
x <- subset(racing,Bike==vb[i])
#Mean
vmeans[i] <- mean(x$Time)
}
names(vmeans) <- vb
输出:
vmeans
A1 A2 A3
70 71 68
使用 base-R,我认为以下内容很有指导意义:
results <- data.frame("Bike"=NA, "MeanTime"=NA)
for(i in unique(racing$Bike)) {
tmp <- filter(racing, Bike == i)
print(tmp) ; print(mean(tmp$Time))
results[match(i, unique(racing$Bike)),] <- c(i, mean(tmp$Time))
}
print(results)
这给出了以下内容:
> print(results)
Bike MeanTime
1 A1 70
2 A2 71
3 A3 68
在打印循环正在做什么的基础上
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.