我有两个数据帧,一个包含时间戳和air_temperature
air_temp time_stamp
85.1 1396335600
85.4 1396335860
另一个包含startTime,endTime,位置坐标和规范名称。
startTime endTime location.lat location.lon name
1396334278 1396374621 37.77638 -122.4176 Work
1396375256 1396376369 37.78391 -122.4054 Work
对于第一个数据帧中的每一行,我想确定它所在的第二个数据帧中的哪个时间范围,即时间戳1396335600是否在startTime 1396334278和endTime 1396374621之间,添加位置和名称值到第一个data.frame中的行。
第二个数据帧中的开始和结束时间不重叠,并且线性增加。但是它们不是完全连续的,所以如果时间戳落在两个时间段之间,我需要将位置标记为NA。如果它确实适合开始和结束时间,我想将location.lat,location.lon和name列添加到第一个数据框。
感谢您的帮助。
答案 0 :(得分:1)
试试这个。未经测试。
newdata <- data2[data1$timestamp>=data2$startTime & data1$timestamp<=data2$endTime ,3:5]
data1 <- cbind(data1[data1$timestamp>=data2$startTime & data1$timestamp<=data2$endTime,],newdata)
如果timestamp不在startTime和endTime之间,则不会返回任何值,因此理论上您的返回数据集可能比原始数据集短。以防万一我使用与data2相同的TRUE FALSE向量处理data1,因此它们的长度相同。
答案 1 :(得分:0)
rowidx <- sapply(dfrm1$time_stamp, function(x) which( dfrm2$startTime <= x & dfrm2$endTime >= x)
cbind(dfrm1$time_stamp. dfrm2[ rwoidx, c("location.lat","location.lon","name")]
我也没有测试,看起来与CCurtis大致相似,所以请检查一下它是否有效。
答案 2 :(得分:0)
有趣的问题......原来比我原先想象的要复杂得多!! 第1步:设置数据!
DF1 <- read.table(text="air_temp time_stamp
85.1 1396335600
85.4 1396335860",header=TRUE)
DF2 <- read.table(text="startTime endTime location.lat location.lon name
1396334278 1396374621 37.77638 -122.4176 Work
1396375256 1396376369 37.78391 -122.4054 Work",header=TRUE)
第2步:对于time_stamp
中DF1
中的每个index
计算DF2
中适当的index <- sapply(DF1$time_stamp,
function(i) {
dec <- which(i >= DF2$startTime & i <= DF2$endTime)
ifelse(length(dec) == 0, NA, dec)
}
)
index
:
DF1 <- cbind(DF1,DF2[index,3:5])
row.names(DF1) <- 1:nrow(DF1)
DF1
步骤3:合并两个数据框:
{{1}}
希望这会有所帮助!!