我在数据表中有一个列,其中包含非递减顺序的条目。但是可能有重复的条目。
labels <- c(123,123,124,125,126,126,128)
time <- data.table(labels,unique_labels="")
time
labels unique_labels
1: 123
2: 123
3: 124
4: 125
5: 126
6: 126
7: 128
我想让所有条目都是唯一的,所以输出将是
time
labels unique_labels
1: 123 123
2: 123 124
3: 124 125
4: 125 126
5: 126 127
6: 126 128
7: 128 130
以下是此循环实现:
prev_label <- 0
unique_counter <- 0
for (i in 1:length(time$label)){
if (time$label[i]!=prev_label)
prev_label <- time$label[i]
else
unique_counter <- unique_counter + 1
time$unique_label[i] <- time$label[i] + unique_counter
}
答案 0 :(得分:2)
这是一个矢量化解决方案,可以完全阻止您使用for
循环。
由于time
是R
函数,我已将data.frame
的名称更改为tm
。
cumsum(duplicated(tm$labels)) + tm$labels
[1] 123 124 125 126 127 128 130
tm$unique_labels <- cumsum(duplicated(tm$labels)) + tm$labels
tm
labels unique_labels
1: 123 123
2: 123 124
3: 124 125
4: 125 126
5: 126 127
6: 126 128
7: 128 130
答案 1 :(得分:1)
tank = ("t", 1:NROW(labels), sep="")
time$unique_labels = ifelse(duplicated(time), tank, time$labels)
duplicated
包的data.table
函数返回数据集重复行的索引,只需将其替换为&#34; random&#34;您确定的值未在您的集合中使用