2017-08-02 49 views
1

我在数据表中有一列,其中的条目数量是非递减顺序。但是可能有重复的条目。防止R中的重复项

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

用Google搜索你的问题的称号,并获得:https://stats.stackexchange.com/questions/6759/removing-duplicated-rows-data-frame-in-r – marcusshep

+0

@marcusshep我不想删除重复的条目。只需将它们编辑为“不重复”并寻找一个优雅的R方式来避免循环 – Saltaf

+0

顺便说一句,初始化为'“”'除了可能迫使您的列包含字符串之外没有任何好处。 – Frank

回答

2

有一个矢量化解决方案,完全阻止您使用for循环。 由于timeR函数我已将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
tank = ("t", 1:NROW(labels), sep="") 
time$unique_labels = ifelse(duplicated(time), tank, time$labels) 

的的duplicated功能data.table包返回数据集的重复行的索引,只需将其替换为wi您确定不会使用“随机”值您的集合