比较两个列表中的值并在R中循环删除行

时间:2019-07-04 13:05:02

标签: r loops data.table

我有两个数据帧,我需要将表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 个答案:

答案 0 :(得分:1)

以下是可重现的示例:

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,该变量大于{{1 }},并返回相应的tbl1date

task

有关示例滚动联接的说明,请参见this blog post from Ben Gorman

答案 1 :(得分:0)

非常感谢。这几乎是我想要的输出。但是,我只计算最接近the value of table 2的{​​{1}}。 我的预期输出是:

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开始计数。