【问题标题】:Using data in one data.frame to generate values for a new column in another data.frame in R使用一个data.frame中的数据为R中另一个data.frame中的新列生成值
【发布时间】:2014-04-23 06:05:27
【问题描述】:

我有两个数据帧,一个包含时间戳和空气温度

air_temp  time_stamp
85.1      1396335600
85.4      1396335860

还有另一个,它包含开始时间、结束时间、位置坐标和规范名称。

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 列添加到第一个数据框中。

感谢您的帮助。

【问题讨论】:

  • 查看 which() cbind()rbind() 以获得基本的快速和肮脏的解决方案。否则,请考虑您的时间。

标签: r


【解决方案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)

如果时间戳不在 startTime 和 endTime 之间,则不会返回任何值,因此理论上您返回的数据集可能比原始数据集短。以防万一我用与 data2 相同的 TRUE FALSE 向量处理 data1,所以它们的长度相同。

【讨论】:

  • 感谢您的帮助!除了第一行之外,我得到了所有行的 NA。
  • 更详细地查看了这一点。原来我开枪了。我的代码返回 NA 因为它只比较同一行中的数据。您需要像其他人一样执行 which 循环或在 sapply 中使用 which 以便您可以比较 DF2 中每一行中 DF1 中的每一行。我可以修复此代码,但它看起来与其他代码几乎相同,因此只需使用其中一个即可。我预测,因为您必须将所有行与所有行进行比较,所以代码可能会因更大的数据而变慢。如果发生这种情况,您可能会考虑对数据进行排序以及在最后一个循环中停止的地方启动循环的方法
【解决方案2】:

有趣的问题...结果比我最初想象的要复杂! Step1:设置数据!

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:对于DF1 中的每个time_stamp,计算DF2 中的适当index

index <- sapply(DF1$time_stamp, 
       function(i) {
         dec <- which(i >= DF2$startTime & i <= DF2$endTime)
         ifelse(length(dec) == 0, NA, dec)
         }
       )
index

Step3:合并两个数据框:

DF1 <- cbind(DF1,DF2[index,3:5])
row.names(DF1) <- 1:nrow(DF1)
DF1

希望这会有所帮助!

【讨论】:

  • 谢谢!像魅力一样工作
【解决方案3】:
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 非常相似,所以如果它有效,请给他检查。

【讨论】:

  • 感谢您的礼貌。哇,你快到 10 万了。
猜你喜欢
  • 2012-09-07
  • 1970-01-01
  • 1970-01-01
  • 2020-10-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多