使用一个data.frame中的数据为R中另一个data.frame中的新列生成值

时间:2014-04-23 06:05:27

标签: r

我有两个数据帧,一个包含时间戳和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列添加到第一个数据框。

感谢您的帮助。

3 个答案:

答案 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_stampDF1中的每个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}}

希望这会有所帮助!!