[英]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.