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

StackOverflow https://stackoverflow.com/questions/7822138

Вопрос

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

В качестве фона: я переношу несколько небольших функций утилиты, чтобы выполнить операции на строках кадра данных или пары рамков данных (то есть каждая строка является элементом в наборе), например, уникальный - для создания набора из списка, объединения, пересечение, определение различий и т. Д. Эти имитируют Mimic Matlab intersect(...,'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. Таким образом, я могу найти, где может появиться NAS при расчете x[y] или же y[x]. Анкет Хотя это использование позволяет устанавливать ключи для z_rbind Объект, я бы предпочел не ограничивать себя именно этим вариантом использования.

Примечание 2: Для связанных сообщений, Вот пост при беге unique На рамках данных, с отличными результатами для их запуска с обновленными data.table упаковка. А также Это более ранний пост при беге unique в таблицах данных.

Это было полезно?

Решение

duplicated.data.table Нужно то же самое исправление unique.data.table Получил [Редактировать: теперь сделано в v1.7.2]. Пожалуйста, поднимите еще один отчет об ошибке: bug.report(package="data.table"). Анкет В интересах других наблюдающих, вы уже используете v1.6.7 из R-Forge, а не 1,6,6 на Cran.

Но, по примечанию 1, есть идиома «не присоединиться»:

x[-x[y,which=TRUE]]

Смотрите также FR#1384 (Новые аргументы «не» и «какие»?) Чтобы облегчить пользователям, и это связано с Ключи, которые не совпадают поток, которая входит в более подробную информацию.


Обновлять. Анкет Теперь в v1.8.3 не было реализовано.

DT[-DT["a",which=TRUE,nomatch=0],...]   # old idiom
DT[!"a",...]                            # same result, now preferred.
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top