Подтвердить что ты не робот

Извлечение уникальных строк из таблицы данных в R

Я переношу из фреймов данных и матриц в таблицы данных, но не нашел решения для извлечения уникальных строк из таблицы данных. Я предполагаю, что что-то мне не хватает в обозначении [,J], хотя я еще не нашел ответа в FAQ и интро-виньетках. Как я могу извлечь уникальные строки, не обращаясь к кадрам данных?

Вот пример:

library(data.table)
set.seed(123)
a <- matrix(sample(2, 120, replace = TRUE), ncol = 3)
a <- as.data.frame(a)
b <- as.data.table(a)

# Confirm dimensionality
dim(a) # 40  3
dim(b) # 40  3

# Unique rows using all columns
dim(unique(a))  # 8 3
dim(unique(b))  # 34 3

# Unique rows using only a subset of columns
dim(unique(a[,c("V1","V2")]))   # 4 2
dim(unique(b[,list(V1,V2)]))    # 29 2

Связанный вопрос: Является ли это поведение результатом несортированных данных, например, с помощью функции Unix uniq?

4b9b3361

Ответ 1

Я новичок в data.table, но, немного опираясь на документацию, я обнаружил, что уникальный показывает все строки с уникальными ключами. По умолчанию ключи для таблицы данных выглядят как NULL. Попробуйте следующее:

a <- matrix(sample(2, 120, replace = TRUE), ncol = 3)
a <- as.data.frame(a)
b <- as.data.table(a)

key(b) #NULL

#Now set the key to all columns
setkey(b)
key(b) #"V1" "V2" "V3"

# Unique rows using all columns
dim(unique(a))  # 8 3
dim(unique(b))  # 8 3

Я думаю, что это поведение, которое вы ожидаете.

Обновление. Это действительно старый вопрос, и пакет data.table существенно изменился. Начиная с data.table 1.9.8, unique() по умолчанию использует все столбцы. Чтобы использовать ключевые столбцы, явным образом передаю by = key(DT) в уникальный (заменяя "DT" в вызове на ключ с именем таблицы данных .table). См. data.table NEWS и найдите страницу для "уникальной" для получения дополнительной информации.

Ответ 2

Как уже упоминалось в Seth, пакет data.table развился и теперь предлагает оптимизированные функции для этого.

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

uniqueN(a)

И если вы хотите только выбрать поднабор столбцов, вы можете использовать аргумент 'by':

uniqueN(a,by = c('V1','V2'))