使用R,如何在数据帧的单个列中标记顺序重复值

时间:2013-06-27 20:34:25

标签: r duplicates

这是我的第一篇文章,我是编程和R.

的新手

我正在尝试创建一个新列,以便在单独的列中标记或标记重复的值。

df< - c(2,2,2,2,3,4,3,4,3,4,2,3,7,7,7))

使用duplicated函数返回以下内容:

data.frame(value = df,flag = duplicated(df))

   value  flag  
1      2  FALSE  
2      2  TRUE  
3      2  TRUE  
4      2  TRUE  
5      3  FALSE  
6      4  FALSE  
7      3  TRUE  
8      4  TRUE  
9      3  TRUE  
10     4  TRUE  
11     2  TRUE  
12     3  TRUE  
13     7  FALSE  
14     7  TRUE  
15     7  TRUE   

我想要的是:

   value  flag  
1      2  TRUE  
2      2  TRUE  
3      2  TRUE  
4      2  TRUE  
5      3  FALSE  
6      4  FALSE  
7      3  FALSE  
8      4  FALSE  
9      3  FALSE  
10     4  FALSE  
11     2  FALSE  
12     3  FALSE  
13     7  TRUE    
14     7  TRUE    
15     7  TRUE     

我的数据集有超过200万次观测,因此理想情况下解决方案效率很高。

谢谢你, 约翰

2 个答案:

答案 0 :(得分:7)

rle可以与rep

结合使用
rl <- rle( df )
rep( rl$lengths != 1 , times = rl$lengths )
#  [1]  TRUE  TRUE  TRUE  TRUE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE  TRUE  TRUE
# [15]  TRUE

我相信rle效率很高。

在2e6长度向量上的时间(MBP 2008年末):

system.time({ rl <- rle( df )
res <- rep( rl$lengths != 1 , times = rl$lengths )
 })
#   user  system elapsed 
#  0.449   0.106   0.559

答案 1 :(得分:2)

由于你有超过两百万,我建议你切换到data.table。在这里我的解决方案使用rle类似于@Simon one,我只写了它的data.table版本。我相信对于初学者来说并不总是显而易见的(就像我在data.table下一样)。

library(data.table)
set.seed(1234)
dd <- sample(1:20, 2e+06, rep = TRUE)
DT <- data.table(dd)
system.time(DT[, `:=`(grp2, {
                            dd.rle = rle(dd)  ## store rle to not call it twice
                            rep(dd.rle$lengths > 1, times = dd.rle$lengths)
             })])
##    user  system elapsed 
##    1.17    0.06    1.28
##    user  system elapsed  <- rle twice
##    1.69    0.11    1.86

##        dd  grp2
## 1e+00:  3 FALSE
## 2e+00: 13  TRUE
## 3e+00: 13  TRUE
## 4e+00: 13  TRUE
## 5e+00: 18 FALSE
##    ---         
## 2e+06:  6 FALSE
## 2e+06:  5 FALSE
## 2e+06:  4 FALSE
## 2e+06: 10 FALSE
## 2e+06: 13 FALSE