R- Проблема с созданием значений в кадре данных на основе значений в другом кадре данных - PullRequest
0 голосов
/ 05 декабря 2018

У меня есть 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

Я пытаюсь пометить все метки времени в таблицеB с помощьюсоответствующий номер в таблице A, когда он попадает между временем начала и окончания.Например, для первой строки в таблице 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 обновляется неправильно.Любые советы или помощь будет высоко ценится!

1 Ответ

0 голосов
/ 06 декабря 2018

Более простой вариант, если вы хотите использовать пакет 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...