减去长数据集的行对

时间:2014-01-28 17:53:42

标签: r subtraction

我想找到一种在长数据集中减去时间和米值的方法,每两行(每天两个度量),因此创建一个存储这些值的新表。 (03:21-09:37和3.2-0.9,等等......)有没有可以自动完成的功能。怎么可能设置它?我使用R完全是新的,我只需要用R

来弄清楚那些东西
time <- c("03:21","09:37","15:41","21:46","03:54","10:12")
day <- c(1,1,1,1,2,2)
meters <- c(3.2,0.9,3.2,0.9,3.2,0.9)

df <- data.frame(day,time,meters)

  day  time meters
1   1 03:21    3.2
2   1 09:37    0.9
3   1 15:41    3.2
4   1 21:46    0.9
5   2 03:54    3.2
6   2 10:12    0.9

2 个答案:

答案 0 :(得分:3)

以下是一些可以快速考虑的选项:

选项1 :使用TRUEFALSE的子集来计算差异:

Time <- strptime(df$time, format="%H:%M")
TimeD <- Time[c(TRUE, FALSE)] - Time[c(FALSE, TRUE)]
MetersD <- df$meters[c(TRUE, FALSE)] - df$meters[c(FALSE, TRUE)]
cbind(meters = MetersD, time = TimeD)
#      meters      time
# [1,]    2.3 -6.266667
# [2,]    2.3 -6.083333
# [3,]    2.3 -6.300000

选项2 :使用%/%创建分组变量并使用aggregate

df$pairs <- c(0, 1:(nrow(df)-1) %/% 2)
df$time2 <- strptime(df$time, format="%H:%M")
aggregate(list(meters = df$meters, time = df$time2), 
          by = list(pairs = df$pairs), FUN=function(y) diff(rev(y)))
#   pairs meters       time
# 1     0    2.3 -6.266667 
# 2     1    2.3 -6.083333 
# 3     2    2.3 -6.300000

更新

将这个想法扩展到让你的“日期”专栏落后太多

并不太难
with(df, {
  time <- strptime(time, format="%H:%M")
  time <- time[c(TRUE, FALSE)] - time[c(FALSE, TRUE)]
  meters <- meters[c(TRUE, FALSE)] - meters[c(FALSE, TRUE)]
  day <- day[c(TRUE, FALSE)]
  data.frame(day, time, meters)
})
#   day            time meters
# 1   1 -6.266667 hours    2.3
# 2   1 -6.083333 hours    2.3
# 3   2 -6.300000 hours    2.3

答案 1 :(得分:1)

使用diff

# Create a proper date
df$date <- strptime(paste(df$day,df$time),format="%d %H:%M")

new_df <- data.frame(
  diff_meters = abs(diff(df$meters)), 
  diff_time = diff(df$date))

new_df

      diff_meters      diff_time
1         2.3 6.266667 hours
2         2.3 6.066667 hours
3         2.3 6.083333 hours
4         2.3 6.133333 hours
5         2.3 6.300000 hours

如果那是你真正想要的东西,那么很容易得到其他每一行(从问题和评论中都不是很清楚:

new_df[seq(1,nrow(new_df),2),]

  diff_meters      diff_time
1         2.3 6.266667 hours
3         2.3 6.083333 hours
5         2.3 6.300000 hours