Matlab 基于特定变量对数据重新采样

Matlab 基于特定变量对数据重新采样,matlab,resampling,Matlab,Resampling,我有一个大数据集,如下所示。从数据中,我想根据“id”随机取样。由于数据有5个ID,我想用替换的方法对5个ID进行采样,并用采样ID的观察结果生成一个新的数据集 id value var1 var2 … 1 1 1 2 1 3 1 4 2 5 2 6 2 7 3 8 3

我有一个大数据集,如下所示。从数据中,我想根据“id”随机取样。由于数据有5个ID,我想用替换的方法对5个ID进行采样,并用采样ID的观察结果生成一个新的数据集

 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          
让我们假设,我从1到5随机抽取5个值(因为有5个唯一ID),结果是(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   

下面是从1到5的ID的示例代码

% 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,:);
对于更独特的ID,您可以修改代码


编辑:修改了数据大小,并重写了第二个for循环

嗯。。。我的数据集太大(超过1000万),我需要在forloop中执行此操作……是的,这不是最好的主意。我会考虑一个新的。@Johnlegend2,我更改了数据大小,没花那么长时间。在我的机器上,1000万乘10的矩阵只需要2秒钟。太好了。我会试试的。谢谢你