Разбиение списка строк символов на разделы

Вот моя проблема. У меня есть набор данных с 200 тыс. строк.

  • Каждая строка соответствует тесту, проведенному на субъекте.
  • Субъекты имеют неравное количество тестов.
  • Каждое испытание датировано.

Я хочу присвоить индекс каждому тесту. Например. Первый тест субъекта 1 будет равен 1, второй тест субъекта 1 будет равен 2. Первый тест субъекта 2 будет равен 1 и т. д.

Моя стратегия состоит в том, чтобы получить список уникальных идентификаторов субъектов, использовать lapply для подмножить набор данных в список фреймов данных, используя уникальные идентификаторы субъекта, при этом каждый субъект имеет свой собственный фрейм данных с проведенными тестами. В идеале я мог бы сортировать каждый кадр данных каждого субъекта и назначать индекс для каждого теста.

Тем не менее, выполнение этого с кадром данных 200k x 32 привело к тому, что мой ноутбук (i5, Sandy Bridge, 4 ГБ оперативной памяти) довольно быстро исчерпал память.

У меня 2 вопроса:

  1. Есть ли лучший способ сделать это?
  2. Если нет, единственный способ преодолеть ограничение памяти — разбить мой уникальный список SubjectID на более мелкие наборы, например, 1000 SubjectID в каждом списке, применить его к набору данных и, в конце всего, соединить списки вместе. Затем, как мне создать функцию, чтобы разбить мой список SubjectID, предоставив, скажем, целое число, обозначающее количество разделов. например BreakPartition(Dataset, 5) разбивает набор данных на 5 разделов поровну.

Вот код для генерации фиктивных данных:

UniqueSubjectID <- sapply(1:500, function(i) paste(letters[sample(1:26, 5, replace = TRUE)], collapse =""))
UniqueSubjectID <- subset(UniqueSubjectID, !duplicated(UniqueSubjectID))
Dataset <- data.frame(SubID = sample(sapply(1:500, function(i) paste(letters[sample(1:26, 5, replace = TRUE)], collapse ="")),5000, replace = TRUE))
Dates <- sample(c(dates = format(seq(ISOdate(2010,1,1), by='day', length=365), format='%d.%m.%Y')), 5000, replace = TRUE)
Dataset <- cbind(Dataset, Dates)
5
задан Matt Dowle 15 June 2012 в 17:31
поделиться