2017-09-23 8 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 

나는 R과 함께 .. 코드

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

하지만 분명히 너무 많은 복사본을 만들어 다음

어떤 도움을 시도하거나 SAS는 매우 감사합니다! 당신은 단지 다음 두 출력 문을 사용하여 관찰의 수를 두 번하려면

+0

논리가 확실하지 않습니다. – akrun

+0

'id = 2'가 3 번 나타나지 않아야합니까? (총 9 개). 그렇다면 다음을 시도해보십시오 :'df [rep (rownames (df), with (df, ave (id, id, FUN = length))),]' – Sotos

+0

음, 원래 데이터 세트에서 나는 하나의 주제 그런 다음 원본 데이터의 copys 인 두 개의 행과 두 개의 여분의 행이있는 새 데이터를 만들고 싶습니다. 피사체의 행 수가 3 인 경우와 마찬가지로 데이터 집합에 3 개의 추가 행을 만들려고합니다. 따라서 해당 피사체의 행 수가 6입니다. – 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

를 사용할 수 있습니다. 또는 입력 데이터 세트를 두 번 읽습니다.

주문이 중요한 경우 두 개의 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;