2017-09-23 96 views
-1

我想复制数据集中的行,具体取决于原始数据集中主题所具有的行数。根据SAS或R中的条件创建重复行

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 

我已创建此计数变量来检测每个主题所具有的行数。 (不要介意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

逻辑不清楚 – akrun

+0

应该不是'id = 2'出现3次? (即总共9个)。如果是这样,试试这个:'df [rep(rownames(df),with(df,ave(id,id,FUN = length))),]' – Sotos

+0

嗯,所以如果在原始数据集中,那么我想创建一个新的数据,其中存在这两行加两个额外的行,从原始数据复制。如果主题的行数为3,那么相同,那么我想在数据集中创建三个额外的行,因此该主题的行数是六个。 – Laura

回答

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 
+0

只是要清楚:这是一个R解决方案? – pinegulf

+0

@pinegulf是的,这是一个使用'data.table'包的R解决方案。我没有注意到questin中有多个标签。 – akrun

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(因此你可以使用NREPS *(每个ID 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; 
0

如果目标是“加倍”你的数据集,这对我来说似乎不清楚,这里有一种方法。

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

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