根据SAS或R中的条件创建重复行
问题描述:
我想复制数据集中的行,具体取决于原始数据集中主题所具有的行数。根据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是高度赞赏!
答
我们可以使用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
答
如果你只是要仔细观察的编号,然后只用两个输出语句。或者两次读取输入数据集。
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;
答
如果目标是“加倍”你的数据集,这对我来说似乎不清楚,这里有一种方法。
*add data in twice;
data want;
set have have;
run;
*double the records;
proc sort data=want;
by id;
run;
逻辑不清楚 – akrun
应该不是'id = 2'出现3次? (即总共9个)。如果是这样,试试这个:'df [rep(rownames(df),with(df,ave(id,id,FUN = length))),]' – Sotos
嗯,所以如果在原始数据集中,那么我想创建一个新的数据,其中存在这两行加两个额外的行,从原始数据复制。如果主题的行数为3,那么相同,那么我想在数据集中创建三个额外的行,因此该主题的行数是六个。 – Laura