Перенос операций набора из фреймов данных R в таблицы данных: как идентифицировать повторяющиеся строки?

[Обновление 1: как заметил Мэтью Доул, я использую data.table версии 1.6.7 на R-Forge, а не на CRAN. Вы не увидите такого же поведения с более ранней версией data.table .]

В качестве фона: я портирую несколько небольших служебных функций, чтобы выполнять операции установки над строками фрейма данных или парами фреймы данных (т.е. каждая строка является элементом в наборе), например уникальный - для создания набора из списка, объединения, пересечения, разницы между множествами и т. д. Они имитируют перекрестка (..., 'rows') , setdiff (..., 'rows ') и т. Д., Которые, похоже, не имеют аналогов в R (операции над наборами R ограничены векторами и списками, но не строками матриц или фреймами данных). Примеры этих маленьких функций приведены ниже. Если эта функция для фреймов данных уже существует в каком-либо пакете или базе R, я открыт для предложений.

Я перенес их в таблицы данных, и одним из необходимых шагов в текущем подходе является поиск повторяющихся строк. Когда выполняется duplicated () , возвращается ошибка, в которой говорится, что таблицы данных должны иметь ключи. Это досадное препятствие - кроме установки ключей, что не является универсальным решением и увеличивает вычислительные затраты, есть ли другой способ найти повторяющиеся объекты?

Вот воспроизводимый пример:

library(data.table)
set.seed(0)
x   <- as.data.table(matrix(sample(2, 100, replace = TRUE), ncol = 4))
y   <- as.data.table(matrix(sample(2, 100, replace = TRUE), ncol = 4))

res3    <- dt_intersect(x,y)

Получение этого сообщения об ошибке :

Error in duplicated.data.table(z_rbind) : data table must have keys

Код работает как есть для фреймов данных, хотя я назвал каждую функцию шаблоном dt_operation .

Есть ли способ обойти эту проблему? Настройка ключей работает только для целых чисел, что является ограничением, которое я не могу принять для входных данных. Так что, возможно, мне не хватает умного способа использования таблиц данных?


Пример функций операций с наборами, где элементами наборов являются строки данных:

dt_unique       <- function(x){
    return(unique(x))
}

dt_union        <- function(x,y){
    z_rbind     <- rbind(x,y)
    z_unique    <- dt_unique(z_rbind)
    return(z_unique)
}

dt_intersect    <- function(x,y){
    zx          <- dt_unique(x)
    zy          <- dt_unique(y)

    z_rbind     <- rbind(zy,zx)
    ixDupe      <- which(duplicated(z_rbind))
    z           <- z_rbind[ixDupe,]
    return(z)
}

dt_setdiff      <- function(x,y){
    zx          <- dt_unique(x)
    zy          <- dt_unique(y)

    z_rbind     <- rbind(zy,zx)
    ixRangeX    <- (nrow(zy) + 1):nrow(z_rbind)
    ixNotDupe   <- which(!duplicated(z_rbind))
    ixDiff      <- intersect(ixNotDupe, ixRangeX)
    diffX       <- z_rbind[ixDiff,]
    return(diffX)
}

Примечание 1: Эти вспомогательные функции предназначены для нахождения строки, где ключевые значения в x не входят в число ключевых значений в y. Таким образом, я могу найти, где могут появиться NA при вычислении x [y] или y [x] . Хотя это использование позволяет устанавливать ключи для объекта z_rbind , я бы предпочел не ограничивать себя только этим вариантом использования.

Примечание 2: для связанных сообщений вот сообщение о запуске unique на фреймах данных, с отличными результатами при запуске с обновленной таблицей data.table ]. И это более ранняя запись о запуске unique в таблицах данных.

6
задан Community 23 May 2017 в 12:10
поделиться