[英]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.