[英]Group rows in data frame based on time difference between consecutive rows
我有這種類型的數據框
YEAR MONTH DAY HOUR LON LAT
1860 10 3 13 -19.50 3.00
1860 10 3 17 -19.50 4.00
1860 10 3 21 -19.50 5.00
1860 10 5 5 -20.50 6.00
1860 10 5 13 -21.50 7.00
1860 10 5 17 -21.50 8.00
1860 10 6 1 -22.50 9.00
1860 10 6 5 -22.50 10.00
1860 12 5 9 -22.50 -7.00
1860 12 5 18 -23.50 -8.00
1860 12 5 22 -23.50 -9.00
1860 12 6 6 -24.50 -10.00
1860 12 6 10 -24.50 -11.00
1860 12 6 18 -24.50 -12.00
我想做的是為時間上接近的點的每個子集計算插值線(例如,連續點之間的時間差小於4天;在上面的示例中有2個子集:一個從1860-10-3到1860年-10-6,另一個從1860-12-5到1860-12-6),然后創建一個額外的列,其擬合相關系數與各個子集內插線相關聯。
問題是我不知道如何根據上述標准正確地對我的數據幀進行子集化。
這是對連續行之間的時間差小於4天的行進行分組的另一種可能性。
# create date variable
df$date <- with(df, as.Date(paste(YEAR, MONTH, DAY, sep = "-")))
# calculate succesive differences between dates
# and identify gaps larger than 4
df$gap <- c(0, diff(df$date) > 4)
# cumulative sum of 'gap' variable
df$group <- cumsum(df$gap) + 1
df
# YEAR MONTH DAY HOUR LON LAT date gap group
# 1 1860 10 3 13 -19.5 3 1860-10-03 0 1
# 2 1860 10 3 17 -19.5 4 1860-10-03 0 1
# 3 1860 10 3 21 -19.5 5 1860-10-03 0 1
# 4 1860 10 5 5 -20.5 6 1860-10-05 0 1
# 5 1860 10 5 13 -21.5 7 1860-10-05 0 1
# 6 1860 10 5 17 -21.5 8 1860-10-05 0 1
# 7 1860 10 6 1 -22.5 9 1860-10-06 0 1
# 8 1860 10 6 5 -22.5 10 1860-10-06 0 1
# 9 1860 12 5 9 -22.5 -7 1860-12-05 1 2
# 10 1860 12 5 18 -23.5 -8 1860-12-05 0 2
# 11 1860 12 5 22 -23.5 -9 1860-12-05 0 2
# 12 1860 12 6 6 -24.5 -10 1860-12-06 0 2
# 13 1860 12 6 10 -24.5 -11 1860-12-06 0 2
# 14 1860 12 6 18 -24.5 -12 1860-12-06 0 2
免責聲明: diff
& cumsum
部分受此問答的啟發: 如何將向量划分為規則的連續序列組? 。
我會按照這些思路嘗試一些方法。 由於您提到只需要弄清楚子集邏輯,所以我不必費心添加相關系數計算。
df$date <- as.Date(paste(df$YEAR,df$MONTH,df$DAY),'%Y %m %d')
uniquedates <- unique(df$date)
uniquedatesfourth <- uniquedates + 4
for ( i in seq(length(uniquedates)))
{
tempsubset <- subset(df, date >= uniquedates[i] & date >= uniquedatesfourth[i])
# operations on tempsubset
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.