使用多个匹配

时间:2017-08-08 19:41:56

标签: r data.table

我之前发布了一个关于在data.table中加入列的问题,其中一列(dep)具有条目的依赖信息。因此,条目3取决于带有标签' 40'的记录。然后匹配'列被分配了条目所依赖的标签的id值。问题发布在这里:Comparing columns uptill certain index in R

library(data.table)
trace <- data.table(id=1:10, dep=c(-1,45,40,47,0,45,43,42,45,45), 
label=c(99,40,43,45,47,42,48,45,52,67), mark=rep("",10))
   id dep label mark
1:  1  -1    99      
2:  2  45    40    
3:  3  40    43     
4:  4  47    45    
5:  5  0     47     
6:  6  45    42    
7:  7  43    48  
8:  8  42    45     
9:  9  45    52    
10: 10  45   67  

会导致

    id dep label mark
1:  1  -1    99  1    
2:  2  45    40  2  
3:  3  40    43  2   
4:  4  47    45  4  
5:  5  0     47  5   
6:  6  45    42  4  
7:  7  43    48  3
8:  8  42    45  6   
9:  9  45    52  8  
10: 10  45   67  8

以下解决方案对我有用:

trace[, mark := trace[.(dep = dep, id = id), on=.(label = dep, id < id), mult="last", x.id]]

# if not found, use current id
trace[is.na(mark), mark := id ]

对于上述情况,对于重复项,我们使用的是最近的匹配项。 但是,如果我想保留所有匹配,而不是匹配到最后一个条目,是否有一种方法获得类似于此的输出(其中最后和第二个条目具有多个依赖项):

   id dep label mark
1:  1  -1    99  1    
2:  2  45    40  2  
3:  3  40    43  2   
4:  4  47    45  4  
5:  5  0     47  5   
6:  6  45    42  4  
7:  7  43    48  3
8:  8  42    45  6   
9:  9  45    52  4,8  
10: 10  45   67  4,8  

我并不关心记录这些依赖关系的格式。使用mult =&#34; all&#34;,

稍微修改了早期的解决方案
trace[, mark := trace[.(dep = dep, id = id), on=.(label = dep, id < id), mult="all", toString(x.id)]]

导致此

 id dep label                                   mark
 1:  1  -1    99 NA, NA, 2, NA, NA, 4, 3, 6, 4, 8, 4, 8
 2:  2  45    40 NA, NA, 2, NA, NA, 4, 3, 6, 4, 8, 4, 8
 3:  3  40    43 NA, NA, 2, NA, NA, 4, 3, 6, 4, 8, 4, 8
 4:  4  47    45 NA, NA, 2, NA, NA, 4, 3, 6, 4, 8, 4, 8
 5:  5   0    47 NA, NA, 2, NA, NA, 4, 3, 6, 4, 8, 4, 8
 6:  6  45    42 NA, NA, 2, NA, NA, 4, 3, 6, 4, 8, 4, 8
 7:  7  43    48 NA, NA, 2, NA, NA, 4, 3, 6, 4, 8, 4, 8
 8:  8  42    45 NA, NA, 2, NA, NA, 4, 3, 6, 4, 8, 4, 8
 9:  9  45    52 NA, NA, 2, NA, NA, 4, 3, 6, 4, 8, 4, 8
10: 10  45    67 NA, NA, 2, NA, NA, 4, 3, 6, 4, 8, 4, 8

1 个答案:

答案 0 :(得分:3)

好的,稍作修改:

Android SDK Tools : 26.0.2
Node              : v8.2.1
OS                : Linux 4.10
npm               : 5.3.0 

它使用trace[, mark := trace[.(dep = dep, id = id), on=.(label = dep, id < id), if (all(is.na(x.id))) NA_character_ else toString(x.id), by=.EACHI]$V1 ] # if not found, use current id trace[is.na(mark), mark := as.character(id) ] ,因为as.character(id)现在是一个字符串变量。

要了解mark的工作原理,请尝试自行运行此部分:

by=.EACHI

评论。我预计这对于较大的表格来说不会很好。此外,该列不再匹配trace[.(dep = dep, id = id), on=.(label = dep, id < id), if (all(is.na(x.id))) NA_character_ else toString(x.id), by=.EACHI] 的类型,因此它不能用于合并等。id - 类列会遇到同样的问题:

list