сравнить значение в двух списках и удалить строку в цикле в R - PullRequest
0 голосов
/ 04 июля 2019

У меня есть два фрейма данных, и мне нужно сравнить значения таблицы 1 со значениями таблицы 2.

Table 1: (each value correspoding one task)

Value: 5 10 15 20 25 30
Task: a b c d e f

Table 2: (each value corresponding one date)
Value: 4 6 8 12 16 18 22 27
Date: 3 5 8 9 11 18 20 19

Когда значение таблицы 1 превышает значение таблицы 2, я хочу получить соответствующие задачи и даты. Например:

Выходные данные для table2$value[2] > table1$value[1] должны быть заданием a и датой 3.

Также, когда задача в таблице 1 извлечена, я хочу удалить соответствующую строку. Например, следующий цикл должен быть:

Table 1: 
Value: 10 15 20 25 30
Task:  b c d e f
Table 2: 
Value: 4 6 8 12 16 18 22 27
Date: 1 3 5 8 9 11 18 20 19
-->output: 
table2$value[4]=12 > table1$value[1]= 10 -> output: task b and date 9

    for (i in 1:length(Table2$value)) {
      for (a in 1:length(Table1$value)) {
        if (Table2$value[i]>Table1$value[a]){ 
          x<-table2$date[i]      
          y<-table1$task[a]
          newtable<-data.frame(x,y)
          table1$value<-table1$value[-c(a)]

        }
      }
    }

Ответы [ 2 ]

1 голос
/ 04 июля 2019

Вот воспроизводимый пример:

library(data.table)    
tbl1 <- data.table(value=seq(5, 30, 5), task=letters[1:6])
tbl2 <- data.table(value=c(4, 6, 8, 12, 16, 18, 22, 27),
                   date=c(3, 5, 8, 9, 11, 18, 20, 19))

tbl1
##    value task
## 1:     5    a
## 2:    10    b
## 3:    15    c
## 4:    20    d
## 5:    25    e
## 6:    30    f

tbl2
##    value date
## 1:     4    3
## 2:     6    5
## 3:     8    8
## 4:    12    9
## 5:    16   11
## 6:    18   18
## 7:    22   20
## 8:    27   19

Вместо того, чтобы использовать цикл (в этом нет ничего плохого), этот ответ использует «скользящее соединение», чтобы найти value из tbl2 это больше, чем значение из tbl1, и возвращает соответствующие date и task:

res <- tbl2[tbl1, on="value", roll=-Inf]
## res
##    value date task
## 1:     5    5    a
## 2:    10    9    b
## 3:    15   11    c
## 4:    20   20    d
## 5:    25   19    e
## 6:    30   NA    f

Для объяснения подвижных объединений с примерами см. это сообщение в блогеот Бена Гормана .

0 голосов
/ 04 июля 2019

Большое спасибо.Это почти вывод, который я хочу.Тем не менее, я считаю только the value of table 2, который ближе, чем value of table 1.Мой ожидаемый результат:

value date task
5      5    a   
10     9    b 
15     11   c
20     20   d
25     19   e
30     NA   f

, если task уже извлечено в tbl1, я хочу удалить его и начать отсчет со второго value из tbl1.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...