Пометить все повторяющиеся строки в R как в Stata

В продолжение моего вопросаВотЯ пытаюсь повторить в R функциональность команды Stataduplicates tag, что позволяет мне помечать все строки набора данных, которые являются дубликатами, с точки зрения заданного набора переменных:

clear *
set obs 16
g f1 = _n
expand 104
bys f1: g f2 = _n
expand 2
bys f1 f2: g f3 = _n
expand 41
bys f1 f2 f3: g f4 = _n
des  // describe the dataset in memory

preserve
sample 10  // draw a 10% random sample
tempfile sampledata
save `sampledata', replace
restore

// append the duplicate rows to the data
append using `sampledata'
sort f1-f4

duplicates tag f1-f4, generate(dupvar)
browse if dupvar == 1  // check that all duplicate rows have been tagged
редактировать

Вот что производит Stata (добавлено по запросу @ Arun):

f1   f2   f3   f4   dupvar  
 1    1    1    1        0  
 1    1    1    2        0  
 1    1    1    3        1  
 1    1    1    3        1  
 1    1    1    4        0  
 1    1    1    5        0  
 1    1    1    6        0  
 1    1    1    7        0  
 1    1    1    8        1  
 1    1    1    8        1

Обратите внимание, что для(f1, f2, f3, f4) = (1, 1, 1, 3) Есть два ряда, и оба из них отмеченыdupvar = 1, Точно так же для двух строк, которые являются дубликатами для(f1, f2, f3, f4) =(1, 1, 1, 8).

Р:

Базовая функцияduplicated теги только второй дубликат и далее. Итак, я написал функцию для репликации функциональности Stata в R, используяddply.

# Values of (f1, f2, f3, f4) uniquely identify observations
dfUnique = expand.grid(f1 = factor(1:16),
            f2 = factor(1:41),
            f3 = factor(1:2),
            f4 = factor(1:104))

# sample some extra rows and rbind them
dfDup = rbind(dfUnique, dfUnique[sample(1:nrow(dfUnique), 100), ])

# dummy data 
dfDup$data = rnorm(nrow(dfDup))

# function: use ddply to tag all duplicate rows in the data
fnDupTag = function(dfX, indexVars) {
  dfDupTag = ddply(dfX, .variables = indexVars, .fun = function(x) {
    if(nrow(x) > 1) x$dup = 1 else x$dup = 0
    return(x)
  })
  return(dfDupTag)
}

# test the function
indexVars = paste0('f', 1:4, sep = '')
dfTemp = fnDupTag(dfDup, indexVars)

Но, как и в связанном вопросе, производительность является огромной проблемой.Другое возможное решение является

dfDup$dup = duplicated(dfDup[, indexVars]) | 
  duplicated(dfDup[, indexVars], fromLast = TRUE) 
dfDupSorted = with(dfDup, dfDup[order(eval(parse(text = indexVars))), ])

У меня есть несколько вопросов:
1. Можно ли сделатьddply версия быстрее?
2. Используется ли вторая версияduplicated верный? Для более чем двух копий дублированных строк? 3. Как бы я сделал это, используяdata.table? Это будет быстрее?

Ответы на вопрос(2)

Ваш ответ на вопрос