Извлечение уникальных строк из таблицы данных в 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
?
Ответы
Ответ 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'))