如何有条件地计算R中行之间列值的差异?

时间:2017-07-06 08:36:51

标签: r

我有以下数据集

(这只是示例,实际数据集会运行到行中)

快照中附加的数据集图像 Dataset snapshot

Do Until EOF(1)
Line Input #1, text
    MyData = MyData & text & vbCrLf  '<-need to append the vbCRLF
Loop
Close #1
strData = Split(MyData, vbCrLf)

我需要为每个用户计算

  • 每当有标记更改时,行之间的时差(以秒为单位)&#39;并将其存储在名为&#39;时差&#39;

  • 的新列中
  • 即。每当标志从1变为2,或2变为3,或2变为1或3变为1时,我需要计算当遇到标志变化时当前行与前一行之间的时间列的时间差。

    < / LI>
  • 我有时间用hh:mm:ss格式。 我可以在这里申请任何for-loop功能吗?

帮助表示赞赏。

2 个答案:

答案 0 :(得分:0)

之前可能需要进行一些预处理:

@BeforeTest, @BeforeClass, @BeforeMethod ...

现在使用df$Time<-strptime(x = df$Time,format = "%H:%M:%S") df$Time<-strftime(x = df$Time,format = "%H:%M:%S") df$Time<-as.POSIXct(df$Time) sol<-function(d){ Time_difference<-numeric(nrow(d)) ind<-which(diff(d$Flag)!=0)+1 #calculate differences in time where change in Flag was detected Time_difference[ind]<-abs(difftime(time1 = d$Time[ind],time2 = d$Time[(ind-1)], units = "secs")) d$Time_Difference<-Time_difference return(d) } 包和plyr函数,它遵循split-apply-combine原则。它将采用数据框(d)并将其拆分为变量(&#34;用户&#34;在这种情况下),应用一个函数(在这种情况下为ddply) data.frame的子集然后将其重新组合到原始data.frame(d)。

sol

答案 1 :(得分:0)

一种方法是将时间变量转换为POSIXlt时间对象,计算时移差异(对于所有行)与移位时间变量。然后将flag变量用于NA您不想要的变量。重要的是你需要区分flag变量,以便知道你的标志何时发生了变化

我在这里列出了所有步骤,但这可能是一种更快捷的方法:

# Create the data
flag <- c(1,1,1,2,1,1,1,1,3,2,1,1,1,1,1,1)
time <- c('11:39:30','11:37:53','20:44:19','22:58:42','23:01:54',
          '23:03:00','23:03:33','23:03:53','15:00:42','19:35:31',
          '19:35:34','10:19:06','10:59:50','10:59:50','12:16:36',
          '12:16:36')

# Shift the time
time_shift <- c(NA,time[1:length(time)-1])

# Turn into POSIXlt objects
time <- strptime(time, format='%H:%M:%S')
time_shift <- strptime(time_shift, format='%H:%M:%S')

data <- data.frame(time, time_shift, flag)

# Calculate diffs
data$time_diff <- as.numeric(abs(difftime(data$time, data$time_shift, units=('secs'))))
data$flag_diff <- c(NA,abs(diff(data$flag)))

# Set non 'flag change' diffs to NA
data$time_diff[data$flag_diff == 0] <- NA

您可能希望删除无用的列并将time转换回原始表示形式,您可以执行以下操作:

data$time <- format(data$time, "%H:%M:%S")
data <- data[c('time', 'flag', 'time_diff')]

这将导致数据框如下所示:

       time flag time_diff
1  11:39:30    1        NA
2  11:37:53    1        NA
3  20:44:19    1        NA
4  22:58:42    2      8063
5  23:01:54    1       192
6  23:03:00    1        NA
7  23:03:33    1        NA
8  23:03:53    1        NA
9  15:00:42    3     28991
10 19:35:31    2     16489
11 19:35:34    1         3
12 10:19:06    1        NA
13 10:59:50    1        NA
14 10:59:50    1        NA
15 12:16:36    1        NA
16 12:16:36    1        NA