У меня есть относительно большой набор данных, который я бы не назвал «большими данными». Это от 3 до 5 миллионов строк; из-за размера я использую библиотеку data.table
для анализа.
Состав набора данных (названный df
, который представляет собой структуру data.table
) можно по существу разбить на:
n идентифицируют поля, в дальнейшем ID_1
, ID_2
, ..., ID_n
, некоторые из которых являются числовыми, а некоторые - векторными.
m категориальных переменных, далее C_1
, ..., C_m
, все из которых являются векторами символов и имеют очень мало значений (2 в одном, 3 в другом и т. д.)
2 измерительные переменные, M_1
и M_2
, обе числовые.
Подмножество данных идентифицируется от ID_1
до ID_n
, имеет полный набор всех значений от C_1
до C_m
и имеет диапазон значений от M_1
и M_2
. Подмножество данных состоит из 126 записей.
Мне нужно точно подсчитать уникальные наборы данных, и из-за размера данных я хотел бы знать, существует ли уже более эффективный способ сделать это. (Зачем катить свою, если это уже сделали другие, гораздо более умные люди?)
Я уже проделал значительную работу в Google, чтобы найти метод, описанный ниже.
Я использовал пакет ht
(https://github.com/nfultz/ht), чтобы я мог использовать фрейм данных в качестве хэш-значения (используя дайджест в фоновом режиме).
Я объединяю поля идентификатора, чтобы создать новый единственный столбец, в дальнейшем называемый ID
, который напоминает ...
ID = "ID1:ID2:...:IDn"
Затем я просматриваю каждый уникальный набор идентификаторов, а затем, используя только фрейм данных поднабора от C_1
до C_m
, M_1
и M_2
(126 строк данных), хэширую значение / увеличиваю хэш.
После этого я беру эту информацию и помещаю ее обратно во фрейм данных.
# Create the hash structure
datasets <- ht()
# Declare the fields which will denote a subset of data
uniqueFields <- c("C_1",..."C_m","M_1","M_2")
# Create the REPETITIONS field in the original data.table structure
df[,REPETITIONS := 0]
# Create the KEY field in the original data.table structure
df[,KEY := ""]
# Use the updateHash function to fill datasets
updateHash <- function(val){
key <- df[ID==val, uniqueFields, with=FALSE]
if (isnull(datasets[key])) {
# If this unique set of data doesn't already exist in datasets...
datasets[key] <- list(val)
} else {
# If this unique set of data does already exist in datasets...
datasets[key] <- append(datasets[key],val)
}
}
# Loop through the ID fields. I've explored using apply;
# this vector is around 10-15K long. This version works.
for (id in unique(df$ID)) {
updateHash(id)
}
# Now update the original data.table structure so the analysis can
# be done. Again, I could use the R apply family, this version works.
for(dataset in ls(datasets)){
IDS <- unlist(datasets[[dataset]]$val)
# For this set of information, how many times was it repeated?
df[ID%in%IDS, REPETITIONS := length(datasets[[dataset]]$val)]
# For this set, what is a unique identifier?
df[ID%in%IDS, KEY := dataset]
}
Это делает то, что я хочу, но не так быстро. Теперь у меня есть возможность представить аккуратный анализ вариативности наборов данных людям, которым это небезразлично. Мне не нравится, что это хоккей, и, так или иначе, я собираюсь почистить это и сделать лучше. Прежде чем я это сделаю, я хочу провести последнюю должную осмотрительность и посмотреть, не подводит ли меня просто мой Google Fu.
Mr_Z, к сожалению, я не могу добавить вывод (он находится в автономной сети) и не могу подробно описать данные. Если абсолютно необходимо, я добавлю код, чтобы смоделировать набор данных. Результатом этого алгоритма должно быть то, что каждое поле уникального идентификатора имеет несколько связанных ПОВТОРЕНИЙ. Это число нет - количество раз, когда ID виден (это был бы один), а, скорее, количество раз, когда подмножество уникальных данных полей повторяется для всех экземпляров ID.
Привет и добро пожаловать в Stack Overflow. Если бы вы могли привести пример своих данных, вам было бы легче помочь и сделать вашу проблему воспроизводимой. Не могли бы вы добавить к вашему вопросу вывод
dput(head(df,20))
? А также как должен выглядеть результат?