根据SAS或R中的条件创建重复行

时间:2017-09-23 15:17:02

标签: r sas duplicates copy

我想根据主题在原始数据集中的行数来复制数据集中的行。

id x1 x2 x3 count
1  a  b  c  1
1  b  c  f  2
2  g  h  a  1
2  a  d  c  2
2  f  g  a  3
3  a  g  a  1

我创建了这个count变量来检测每个主题的行数。 (不要介意x1 - x3的值,它们只是用于说明。)在实际数据集中,我还有比这三个更多的主题。

数据集,我想要的应该是这样的。

id x1 x2 x3 count
1  a  b  c  1
1  b  c  f  2
1  a  b  c  1
1  b  c  f  2
2  g  h  a  1
2  a  d  c  2
2  f  g  a  3
2  g  h  a  1
2  a  d  c  2
2  f  g  a  3
3  a  g  a  1

我尝试过以下代码

data want (drop=i);
set have;
by id;
output;
do i = 1 to count;
output;
end;
run;

但显然它制作了太多的副本..

对R或SAS的任何帮助都非常感谢!

3 个答案:

答案 0 :(得分:0)

我们可以使用data.table

library(data.table)
setDT(df1)[, .SD[rep(seq_len(.N), pmin(2, .N))], id]
#    id x1 x2 x3 count
# 1:  1  a  b  c     1
# 2:  1  b  c  f     2
# 3:  1  a  b  c     1
# 4:  1  b  c  f     2
# 5:  2  g  h  a     1
# 6:  2  a  d  c     2
# 7:  2  f  g  a     3
# 8:  2  g  h  a     1
# 9:  2  a  d  c     2
#10:  2  f  g  a     3
#11:  3  a  g  a     1

答案 1 :(得分:0)

如果您只想将观察次数加倍,那么只需使用两个输出语句即可。或者两次读取输入数据集。

data want;
  set have have;
run;

如果订单很重要,那么您可以使用两个DOW循环将它们加倍。

data want;
  do until (last.id);
    set have;
    by id;
    output;
  end;
  do until (last.id);
    set have;
    by id;
    output;
  end;
run;

您的输入数据集似乎没有每个ID值的行数。如果你有那个变量(称之为NREPS)那么输出重复的DO循环就很简单了。如果目标是使额外副本的数量取决于NREPS(因此您以每个ID的NREPS *(NREPS + 1)观察结束),那么此代码将起作用:

data want;
  set have;
  do _n_=1 to nreps+1 ;
    output;
  end;
run;

如果必须,您可以计入相同的数据步骤,假设数据按ID排序。

data want;
  do nreps=1 by 1 until (last.id);
    set have;
    by id;
  end;
  do until (last.id);
    set have;
    by id;
    do _n_=1 to nreps+1 ;
      output;
    end;
  end;
run;

答案 2 :(得分:0)

如果目标是“重复”'您的数据集对我来说似乎不太清楚,这是一种方法。

 *add data in twice;
 data want;
   set have have;
 run;

 *double the records;
 proc sort data=want; 
   by id;
 run;