比较具有多个条件的列(数字)中的多个值(行)r

时间:2017-01-23 15:17:57

标签: r for-loop compare

作为R的初学者,我无法从我的数据框中获取特定数据。我的数据每10分钟进行一次测量,每天测量144行。我想要做的是比较“电池可用”中的3个值(行)。和' date'符合特定条件的列:

  • 2个外行的batteryAvailable值必须相等
  • 中间行和2个外行之间的电池差异必须至少为5
  • 最大允许的间隔是一天(所以第一行和最后一行的日期差异必须<= 24h)

batteryAvailable列表示一个百分比,在df中它是一个数值,范围为[0-100]

数据示例:

          date         batteryAvailable solarChargeTotal    V2GTotal

1   05/05/2014 07:30        61               389.7           354.4
2   05/05/2014 07:40        61               389.7           354.4
3   05/05/2014 07:50        62               389.8           354.4
4   05/05/2014 08:00        62               389.8           354.4
5   05/05/2014 08:10        63               389.9           354.4
6   05/05/2014 08:20        63               389.9           354.4
7   05/05/2014 08:30        64               390             354.4
8   05/05/2014 08:40        65               390             354.4
9   05/05/2014 08:50        64               390.1           354.5
10  05/05/2014 09:00        64               390.1           354.5
11  05/05/2014 09:10        62               390.1           354.7
12  05/05/2014 09:20        62               390.2           354.8
13  05/05/2014 09:30        64               390.4           354.8
14  05/05/2014 09:40        66               390.5           354.8
15  05/05/2014 09:50        68               390.7           354.8
16  05/05/2014 10:00        71               390.9           354.8
17  05/05/2014 10:10        72               391             354.8
18  05/05/2014 10:20        72               391             354.9
19  05/05/2014 10:30        74               391.2           354.9
20  05/05/2014 10:40        77               391.4           354.9

如果满足上述条件,则进行计算。到目前为止,我已尝试使用&#39; for循环&#39;去做这个。然而,它是非常无效的,我没有得到所有可能的输出。这就是我现在的代码:

for(i in 2:nrow(df)) {


h <- i-1
j <- i+1

rowh <- df[h,]
rowi <- df[i,]
rowj <- df[j,]

## all the conditions
if (!is.na(rowh$batteryAvailable) &
    !is.na(rowi$batteryAvailable)  &
    !is.na(rowj$batteryAvailable) &
    rowh$batteryAvailable == rowj$batteryAvailable & 
    rowh$batteryAvailable != rowi$batteryAvailable  &
    abs(rowh$batteryAvailable - rowi$batteryAvailable) > 5 &
    difftime(rowj$date, rowh$date, units = "hours") < 24)  {

## the calculation
Charge_h <- (rowi$solarChargeTotal-rowh$solarChargeTotal) 
V2G_h <- (rowi$V2GTotal-rowh$V2GTotal) 

Charge_j <- (rowj$solarChargeTotal-rowi$solarChargeTotal) 
V2G_j <- (rowj$V2GTotal-rowi$V2GTotal) 


if (!exists("bat_efficiency")){
  bat_efficiency <- data.frame()
} 

## storage of found values
if (exists("bat_efficiency")){
  rowj$Charge <- Charge_h + Charge_j
  rowj$V2G <- V2G_h + V2G_j
  bat_efficiency <-rbind(bat_efficiency, rowj)
    }
  }
}

外行和中行之间差异至少为5的条件导致没有找到的点。这很奇怪,因为我知道他们在那里。将这种情况排除在外只能得到电池差异为1或2的观察结果。

基本上我想要的是一种使用3个变量(例如h,i,j)的概念的方法,这些变量在行中移动以比较最大值的时间跨度内的值。 1天,不使用for循环。也许有人知道=>的条件会发生什么? 5,我没有收到错误信息,没有输出。

注意:有一天可能会有不止一次满足要求,我对所有这些要求感兴趣。并不是它在第一个找到的值之后停止。

0 个答案:

没有答案