这是我的第一篇文章,我是编程和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万次观测,因此理想情况下解决方案效率很高。
谢谢你, 约翰
答案 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