如何返回data.frame中(不同的)重复行的第一次出现的位置?

时间:2014-10-25 13:25:14

标签: r dataframe duplicates

假设您有如下数据框:

dfiris <- rbind(iris[1:5, -5], iris[1:5, -5], iris[1:5, -5], iris[1:5, -5], iris[1:5, -5])

由于前5行再重复4次,我想有效地得到:

1  2  3  4  5  6  7  8  9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 
1  2  3  4  5  1  2  3  4  5  1  2  3  4  5  1  2  3  4  5  1  2  3  4  5

函数duplicate()对我没用,因为它只会在某个重复行的第二次出现时返回TRUE。

我的(低效)解决方案:

apply(dfiris, 1, function(df) {

   which(apply(unique(dfiris), 1, function(df_u) identical(df, df_u)))

})

必须有更快的方法来做到这一点。有什么建议吗?

2 个答案:

答案 0 :(得分:2)

使用data.table:

library(data.table)
setDT(dfiris, keep.rownames=TRUE)
print(setkey(dfiris[, list(rn=as.numeric(rn), firstOcc=.I[1]), 
                    by=c(names(dfiris)[-1])], rn))

答案 1 :(得分:1)

您也可以尝试:

 library(dplyr)
 left_join(dfiris,mutate(distinct(dfiris), rn=row_number()))
                                                    %>% select(rn)