下午好。
我有一个简单的假设数据集,包括2名男性跑步者,体重70公斤,可用能量为100,000千卡。两位参赛者都参加了为期13天的比赛,每天的距离不同(km)。
因为运动成本随着体重的减少而下降,我需要重新计算在前一天结束时根据体重消耗的能量。
例如,70公里的跑步者在第1天减掉0.5公斤。跑步者现在体重为69.5公斤,并且在第2天的能量消耗率不同。
这里是数据 - 我手动输入每个跑步者前2天的预期值。
structure(list(ID = structure(c(1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L,
1L, 1L, 1L, 1L, 1L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L,
2L, 2L), .Label = c("Male1", "Male2"), class = "factor"), Day = c(1L,
2L, 3L, 4L, 5L, 6L, 7L, 8L, 9L, 10L, 11L, 12L, 13L, 1L, 2L, 3L,
4L, 5L, 6L, 7L, 8L, 9L, 10L, 11L, 12L, 13L), Km = c(7L, 9L, 15L,
11L, 5L, 15L, 25L, 15L, 12L, 11L, 9L, 8L, 7L, 1L, 2L, 6L, 8L,
15L, 9L, 15L, 12L, 1L, 25L, 2L, 3L, 14L), Kcal = c(328.91, 410.24,
NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, 46.99, 93.97, NA,
NA, NA, NA, NA, NA, NA, NA, NA, NA, NA), NewMass = c(66.96, 66.91,
NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, 69.995, 69.984, NA,
NA, NA, NA, NA, NA, NA, NA, NA, NA, NA)), .Names = c("ID", "Day",
"Km", "Kcal", "NewMass"), class = "data.frame", row.names = c(NA,
-26L))
我首先定义了运动成本(kcal / kg)的函数
costkm <- function(kg) {
(2.57 * (kg ^ -0.316)) * kg #formula to calculate cost of locomotion
}
然后我尝试为每个人(ID)编写代码,每天运行(nrow) 然后是每个跑步者每天跑步的距离(KM)乘以运动公式,然后是当天结束时更新质量的代码(每公斤9,000千卡)。我不能&#34;可视化&#34;如何构建代码...任何帮助将不胜感激!
for (i in unique (df$ID)){
for (j in 1:nrow(i))
df$Kcal<-df$Km * costkm #calculate kcal expended based on current weight
NewMass<- lag(NewMass) - (Kcal/9000) #calculate updated mass
}
}
答案 0 :(得分:0)
首先,使用split
将您的数据框划分为两个数据框(每个参赛者一个):
dfs <- split(df, df$ID)
为您提供了包含两个元素的列表:
str(dfs)
# $ Male1:'data.frame': 13 obs. of 5 variables:
# ..$ ID : Factor w/ 2 levels "Male1","Male2": 1 1 1 1 1 1 1 1 1 1 ...
# ..$ Day : int [1:13] 1 2 3 4 5 6 7 8 9 10 ...
# ..$ Km : int [1:13] 7 9 15 11 5 15 25 15 12 11 ...
# ..$ Kcal : num [1:13] 329 410 NA NA NA ...
# ..$ NewMass: num [1:13] 67 66.9 NA NA NA ...
# $ Male2:'data.frame': 13 obs. of 5 variables:
# ..$ ID : Factor w/ 2 levels "Male1","Male2": 2 2 2 2 2 2 2 2 2 2 ...
# ..$ Day : int [1:13] 1 2 3 4 5 6 7 8 9 10 ...
# ..$ Km : int [1:13] 1 2 6 8 15 9 15 12 1 25 ...
# ..$ Kcal : num [1:13] 47 94 NA NA NA ...
# ..$ NewMass: num [1:13] 70 70 NA NA NA ...
现在,您可以使用lapply
遍历列表,并遍历每个数据帧的行:
output <- lapply(dfs, function(df) {
for (i in 2:nrow(df)) {
df$Kcal[i] <- df$Km[i] * costkm(df$NewMass[i - 1])
df$NewMass[i] <- df$NewMass[i - 1] - (df$Kcal[i] / 9000)
}
return(df)
})
output <- do.call(rbind, output) # Bind the dataframes together again
这会给你
output
# ID Day Km Kcal NewMass
# Male1.1 Male1 1 7 328.91000 66.96000
# Male1.2 Male1 2 9 410.23565 66.91442
# Male1.3 Male1 3 15 683.40769 66.83848
# <snip>
# Male2.14 Male2 1 1 46.99000 69.99500
# Male2.15 Male2 2 2 93.96994 69.98456
# Male2.16 Male2 3 6 281.88106 69.95324
# <snip>