【发布时间】:2017-07-27 12:47:59
【问题描述】:
我有一个包含两列(dep 和 label)的数据框(从文件中读取后)。我想根据匹配设置另一个具有 id 值的列(标记)。如果 'dep' 条目匹配 'labell' 条目,标记获取匹配的 'label' 的 'id'。对于不匹配,mark 获取它自己的 'id' 的值。目前,我正在使用循环解决方案,但我知道在 R 细节中应该有一种巧妙的方法。
trace <- data.table(id=seq(1:7),dep=c(-1,45,40,47,0,45,43),
label=c(99,40,43,45,47,42,48), mark=rep("",7))
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
我知道 r 中的循环很慢,只是举个例子,以下幼稚的 for/while 适用于小尺寸,但我的数据集很大。
trace$mark <- trace$id
for (i in 1:length(trace$id)){
val <- trace$dep[i]
j <- 1
while(j<=i && val !=-1 && val!=0){ // don't compare if val is -1/0
if(val==trace$label[j]){
trace$mark[i] <- trace$id[j]
}
j <-j +1
}
}
我也尝试过使用以下方法,但它仅在有一个匹配项时才有效。
match <- which(trace$dep %in% trace$label)
match_to <- which(trace$label %in% trace$dep)
trace$mark[match] <- trace$mark[match_to]
【问题讨论】:
标签: r