Arrays 按组复制SAS中的值

Arrays 按组复制SAS中的值,arrays,loops,sas,Arrays,Loops,Sas,我有一个数据集,包含一个测量值和它收集的具体日期。我想在几天之间复制这些值,直到最后一个测量日。例如,以下是复制前的数据: Measurement Day Subject1 .85 -1 Subject1 .86 1 Subject1 .91 7 Subject1 .83 9 Subject2

我有一个数据集,包含一个测量值和它收集的具体日期。我想在几天之间复制这些值,直到最后一个测量日。例如,以下是复制前的数据:

           Measurement    Day
Subject1   .85            -1
Subject1   .86            1            
Subject1   .91            7            
Subject1   .83            9            
Subject2   .77            0            
Subject2   .82            5            
Subject2   .86            12           
我想修改上面的数据集,使其如下所示:

           Measurement    Day
Subject1   .85            -1
Subject1   .85            0
Subject1   .86            1
Subject1   .86            2
Subject1   .86            3
Subject1   .86            4
Subject1   .86            5 
Subject1   .86            6           
Subject1   .91            7
Subject1   .91            8            
Subject1   .83            9            
Subject2   .77            0
Subject2   .77            1
Subject2   .77            2
Subject2   .77            3
Subject2   .77            4       
Subject2   .82            5          
Subject2   .82            6
Subject2   .82            7     
Subject2   .82            8     
Subject2   .82            9     
Subject2   .82            10
Subject2   .82            11                      
Subject2   .86            12           

您可以通过将合并数据偏移一行并省略by语句来执行“前瞻性合并”

假设您的数据按主题和日期排序

data merge1 ; merge have have (rename=(day=nextday subject=nextsubject) drop=measurement firstobs=2) ; if subject = nextsubject then do _day = day to nextday - 1 ; output ; end ; else do ; _day = day ; output ; end ; drop day nextday nextsubject ; rename _day = day ; run ;
您可以通过将合并数据偏移一行并省略by语句来执行“前瞻性合并”

假设您的数据按主题和日期排序

data merge1 ; merge have have (rename=(day=nextday subject=nextsubject) drop=measurement firstobs=2) ; if subject = nextsubject then do _day = day to nextday - 1 ; output ; end ; else do ; _day = day ; output ; end ; drop day nextday nextsubject ; rename _day = day ; run ;
考虑使用辅助数据集扩展数据,然后使用正向填充进行左连接合并

data helper;
    set input (keep = Subject Day);
    by Subject;
    if not first.Subject and last.Subject;

    max_day = max(Day);
    day = 0;
    do until(day > max_day);
      output;
      day + 1;
    end;

    drop max_day;
run;

data output;
    merge helper (in=h)
          input (in=i);
    if h;
    by Subject Day;

    retain _k;
    if not missing(Measurement) then _k=Measurement;
    else if missing(Measurement) then Measurement=_k;

    if not missing(Measurement);
    drop _k;
run;
资料

输出


考虑使用辅助数据集扩展数据,然后使用正向填充进行左连接合并

data helper;
    set input (keep = Subject Day);
    by Subject;
    if not first.Subject and last.Subject;

    max_day = max(Day);
    day = 0;
    do until(day > max_day);
      output;
      day + 1;
    end;

    drop max_day;
run;

data output;
    merge helper (in=h)
          input (in=i);
    if h;
    by Subject Day;

    retain _k;
    if not missing(Measurement) then _k=Measurement;
    else if missing(Measurement) then Measurement=_k;

    if not missing(Measurement);
    drop _k;
run;
资料

输出


凉的您可以使用单个DO循环,而不需要_DAY变量。do day=逐日计算,直到第+1天>下一天;需要在第二次引用上保留=日主题数据集选项,以防止覆盖测量变量.Cool。您可以使用单个DO循环,而不需要_DAY变量。do day=逐日计算,直到第+1天>下一天;第二次引用需要keep=day subject dataset选项以防止覆盖度量变量。仅尝试使用此选项。这导致一名受试者的最终体重成为下一名受试者的第一个体重。有办法解决这个问题吗?我不太明白。如果您使用我为再现性而包含的数据运行我的解决方案,则输出将以不同的列顺序匹配您的期望结果。也许你的实际数据与发布的示例不同。是的,我正在使用一个新的数据集。也许我应该更简洁:代码导致下一个受试者的第一个数字被前一个受试者的最终测量覆盖。此外,如果“Day”列中的数字为负数,则不起作用。同样,此解决方案与您发布的期望结果相匹配。受试者2的第一个记录在第0天的测量值为0.77,与输入数据中的测量值完全相同。你的样本不包括我可能会考虑的负面天数。以后,请贴出接近实际的数据!请运行我的可复制示例,首先运行输入的数据部分,然后运行顶部的实际代码。只是尝试使用这个。这导致一名受试者的最终体重成为下一名受试者的第一个体重。有办法解决这个问题吗?我不太明白。如果您使用我为再现性而包含的数据运行我的解决方案,则输出将以不同的列顺序匹配您的期望结果。也许你的实际数据与发布的示例不同。是的,我正在使用一个新的数据集。也许我应该更简洁:代码导致下一个受试者的第一个数字被前一个受试者的最终测量覆盖。此外,如果“Day”列中的数字为负数,则不起作用。同样,此解决方案与您发布的期望结果相匹配。受试者2的第一个记录在第0天的测量值为0.77,与输入数据中的测量值完全相同。你的样本不包括我可能会考虑的负面天数。以后,请贴出接近实际的数据!请运行我的可复制示例,首先运行数据部分进行输入,然后在顶部运行实际代码。