为能量学的功能分配当前值

时间:2017-05-28 20:22:39

标签: r

下午好。

我有一个简单的假设数据集,包括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
  }
}

1 个答案:

答案 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>