повторная выборка данных на основе определенной переменной

У меня есть большой набор данных, как показано ниже. Из данных я хочу случайным образом выполнить выборку на основе идентификатора. Поскольку данные имеют 5 идентификаторов, я хотел бы выбрать 5 идентификаторов с заменой и создать новый набор данных с наблюдениями за выбранными идентификаторами.

 id value   var1    var2    …
  1 1           
  1 2           
  1 3           
  1 4           
  2 5           
  2 6           
  2 7           
  3 8           
  3 9           
  3 10          
  4 11          
  4 12          
  4 13          
  5 14          
  5 15          
  5 16          

Предположим, я случайным образом рисую 5 значений от 1 до 5 (потому что есть 5 уникальных идентификаторов), и результат (2 4 3 2 1). Тогда я хотел бы получить эти данные

  id    value   var1    var2    …
  2 5           
  2 6           
  2 7           
  4 11          
  4 12          
  4 13          
  3 8           
  3 9           
  3 10          
  2 5           
  2 6           
  2 7           
  1 1           
  1 2           
  1 3           
  1 4   

person John legend2    schedule 05.05.2018    source источник


Ответы (1)


Вот пример кода для идентификаторов от 1 до 5.

% data = [1 1; 1 2; 1   3; 1 4; 2 5; 2 6; 2 7; 3 8; 3 9; 3 10; 4 11; 4 12; 4 13;...
%     5 14; 5   15; 5 16];
data = rand(10000000,10);
data(:,1) = randi([1,5], length(data),1);

% Get all the indices from the 1st column;
indxCell = cell(5,1);
for i=1:5
    tmpIndx = find(data(:,1) == i);
    indxCell{i} = tmpIndx;
end

% Rearrange the indices
randIndx = randperm(5);
randIndxCell = indxCell(randIndx, 1);

% Generate a vector of indices by rearranging the 1st column of data matrix. 
numDataPts = length(data);
newIndices = zeros(numDataPts,1);
endIndx = 1;
for i=1:5
    startIndx = endIndx;
    endIndx = startIndx + length(randIndxCell{i});
    newIndices(startIndx:endIndx-1, 1) = randIndxCell{i};
end

newData = data(newIndices,:);

Для получения более уникальных идентификаторов вы можете изменить код.

Изменения: изменил размер данных, а также переписал второй цикл for.

person Nakini    schedule 05.05.2018
comment
Хм ... размер моего набора данных слишком велик (более 10 миллионов), и мне нужно сделать это в forloop ... - person John legend2; 05.05.2018
comment
Да, это не лучшая идея. Буду думать о новом. - person Nakini; 05.05.2018
comment
@ Johnlegend2, я изменил размер данных, и это не заняло много времени. На моей машине матрица размером 10 миллионов на 10 занимала всего 2 секунды. - person Nakini; 06.05.2018
comment
Большой. Попробую. Спасибо - person John legend2; 06.05.2018