我想找到一种在长数据集中减去时间和米值的方法,每两行(每天两个度量),因此创建一个存储这些值的新表。 (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
答案 0 :(得分:3)
以下是一些可以快速考虑的选项:
选项1 :使用TRUE
和FALSE
的子集来计算差异:
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