繁体   English   中英

R-基于另一个数据框中的值在一个数据框中创建值的问题

[英]R- Issue with creating values in a dataframe based on values in another dataframe

我有2个数据框。 首先,我称“ tableA”具有开始时间,停止时间以及与之相关的数字(有很多列,但这些是唯一相关的列)。 我的第二个df是“ tableB”,并带有时间戳。 以下是一些示例数据:

tableA <- data.frame("start" = 1:5, "stop"= 2:6, "numb" = 11:15)

tableB <- data.frame("timeStamp" = c(1.7, 2.1, 2.4, 2.8, 4.5), "numb" = 0)

这将导致帧如下所示:

tableA                     tableB
start  stop  numb          timeStamp  numb
1      2     11            1.7        0
2      3     12            2.1        0
3      4     13            2.4        0  
4      5     14            2.8        0 
5      6     15            4.5        0

当它介于开始时间和停止时间之间时,我试图用tableA中的相应数字标记tableB中的所有时间戳。 例如,对于表B(1.7)中的第一行,它将得到数字11(因为它介于1和2之间)。 因此,对于此数据,我希望tableB看起来像这样:

tableB 
timeStamp  numb
1.7        11
2.1        12
2.4        12
2.8        12
4.5        14

为此,我编写了以下嵌套循环语句:

for(n in 1:length(tableB$timeStamp)) {
  for(i in 1:length(tableA$numb)) {
    if(tableB$timeStamp[n] > tableA$start[i] &
       tableB$timeStamp[n] < tableA$stop[i]) {
         tableB$numb[n] <- tableA$numb[i]
         sprintf("n = %i", n)
         sprintf("i = %i", i)}
   }
  }

但是,tableB $ numb中的所有值都刚刚更改为5,并且没有任何内容输出到控制台。 我不确定我在这里搞砸了什么,因为它似乎从来没有进入过if语句,但是tableB $ numb的更新不正确。 任何提示或帮助将不胜感激!

如果您愿意使用Fuzzyjoin包,那么一个更简单的选择可能是:

tableA <- data.frame("start" = 1:5, "stop"= 2:6, "numb" = 11:15)
tableB <- data.frame("timeStamp" = c(1.7, 2.1, 2.4, 2.8, 4.5))

> fuzzy_left_join(tableB,tableA,
                by = c("timeStamp" = "start","timeStamp" = "stop"),
                match_fun = list(`>=`,`<=`))

  timeStamp start stop numb
1       1.7     1    2   11
2       2.1     2    3   12
3       2.4     2    3   12
4       2.8     2    3   12
5       4.5     4    5   14

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM