我想根据主题在原始数据集中的行数来复制数据集中的行。
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的任何帮助都非常感谢!
答案 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;