我之前发布了一个关于在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
答案 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