2017-09-23 97 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;