我有長格式的Compustat數據,我通過spread
(來自tidyr
包)轉換爲寬格式。R - 從長到寬,再回到相同的長格式
然後我做了一些計算,之後我想再次將數據幀恢復爲長格式。是否有任何一種「內存」功能,以便我的新的長數據框與舊的數據框完全相同(相同的順序)。
問題是,有很多NA
s,每個股票的數據在股票首次上市時開始,並在股票摘牌或樣本結束後結束。我的樣本從1960年到2015年(季度)。當然,並非所有的股票都有這個日期的數據,但是當我從寬幅回到長幅時,每隻股票都會獲得從1960.1到2015.4的所有日期。這種長格式的數據框是我正在構建的分數的一部分,我必須將它與其他長格式數據框(它們都由kypermno和日期具有相同的順序)進行比較,因爲我需要將寬數據幀轉換回確切的原始形式與新的價值。
編輯:這是我的問題的一個例子:
長格式「原始」(稱爲「測試」):
`kypermno fyyyyq ROE_Q
<int> <int> <dbl>
1 1001 1985 0.56
2 1001 1986 0.43
3 1001 1987 0.78
4 1001 1988 NA
5 1001 1989 0.34
6 1001 1990 0.76
7 1002 1980 0.12
8 1002 1981 0.67
9 1002 1982 0.12
10 1002 1983 0.56
11 1002 1984 NA
12 1002 1985 0.91
13 1002 1986 0.45
14 1002 1987 0.23
15 1002 1988 0.54
16 1002 1989 0.14
17 1002 1990 0.19
18 1002 1991 0.27`
用下面的代碼,我把它在寬格式:
dat_wide <- spread(test, kypermno, ROE_Q)
現在在寬幅它看起來像這樣:
fyyyyq `1001` `1002`
* <int> <dbl> <dbl>
1 1980 NA 0.12
2 1981 NA 0.67
3 1982 NA 0.12
4 1983 NA 0.56
5 1984 NA NA
6 1985 0.56 0.91
7 1986 0.43 0.45
8 1987 0.78 0.23
9 1988 NA 0.54
10 1989 0.34 0.14
11 1990 0.76 0.19
12 1991 NA 0.27
當我把它放回了長格式就變成這樣:
dat_long <- gather(dat_wide, key = 'fyyyyq', value = 'ROE_Q', -kypermno)
fyyyyq kypermno ROE_Q
<int> <chr> <dbl>
1 1980 1001 NA
2 1981 1001 NA
3 1982 1001 NA
4 1983 1001 NA
5 1984 1001 NA
6 1985 1001 0.56
7 1986 1001 0.43
8 1987 1001 0.78
9 1988 1001 NA
10 1989 1001 0.34
11 1990 1001 0.76
12 1991 1001 NA
13 1980 1002 0.12
14 1981 1002 0.67
15 1982 1002 0.12
16 1983 1002 0.56
17 1984 1002 NA
18 1985 1002 0.91
19 1986 1002 0.45
20 1987 1002 0.23
21 1988 1002 0.54
22 1989 1002 0.14
23 1990 1002 0.19
24 1991 1002 0.27
正如你可以看到有很多多個NAS現在(因爲它們創建打算形式長寬)和NA省略ISN是一種選擇,因爲所有的NA都被省略(不僅是新創建的)。 因此,當我從寬格式再次返回到長格式時,我想要得到舊的(18行)長格式數據幀,而不是我得到的(24行和「新」NAs)。
我希望我的問題現在已經被理解了。你可以看到我沒有設法在第一列中獲得kypermno,在第二列中獲得fyyyyq(在返回長格式之後),但是我認爲它不會影響上述問題。
請提供可重複的問題/例如,或給予什麼樣的問題的數據集看起來有些跡象喜歡和你期望的樣子。仔細閱讀本文,以獲取有關可重現實例的靈感。 http://stackoverflow.com/questions/5963269/how-to-make-a-great-r-reproducible-example – Drj