我正在尝试在r中运行一个嵌套的for循环,该循环会减去数据帧中变量的每一行

时间:2018-09-06 05:54:57

标签: r datetime dataframe

数据框:

Number Time 
1       10:25:00
2       10:35:15
3       10:42:26

对于数据框中的每个数字,我想减去时间,例如:

Number 1 = 10:25:00 - 10:35:15
Number 2 = 10:35:15 - 10:42:26

我的代码:

for (i in df$Number) {
    for (j in df$Time) {
        subtime <- df$Time[j] - df$Time[j+1]
      }
}

此代码仅导致NA

2 个答案:

答案 0 :(得分:0)

由于在每个循环中都重新分配了subtime,所以在循环结束时仅返回最后一个值。此外,在最后一次迭代中,j == length(df$Time)超出了j + 1的范围,因此df$Time[j + 1]将为NA,这意味着整个结果为NA。

通常,您可以执行以下操作:

df$subtime <- c(NA, diff(df$Time))

其中NA是第一个实例,并由第一个实例的合适默认值替换。您的案件可能需要进一步的治疗,具体取决于df$Time的类别。

(如果您需要进一步的帮助,则应考虑创建数据的MWE。您提供的内容非常接近,但不足以为我们提供帮助。) < / p>

答案 1 :(得分:0)

我认为您可能正在寻找类似的东西。结果以小时为单位。

例如:10:25:00-10:35:15 =-00:10:15 =-(10/60)-(15/3600)= -0.1708333

a = data.frame(Number = c(1, 2, 3), Time = c("10:25:00", "10:35:15", "10:42:26"), stringsAsFactors = FALSE)

x = 2

timeDiff = function(x, a){

  as.difftime(a[x, 2]) - as.difftime(a[x+1, 2]) 

}    

result = sapply(2:nrow(a), timeDiff, a)

result

请注意,情况Number 3不可能计算出这样的差异,因为第四行是必需的,并且您提供的数据帧只有3行。

根据Stack Overflow的提示,我可以看到您是新用户,因此,对于以后的嵌套for循环,我建议您探索sapply或lapply,因为这将使您的代码看起来更简洁,更易于维护。

如果您需要任何进一步的说明,请随时评论我的答案。 :-)