2017-05-07 45 views
4

我有長格式的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(在返回長格式之後),但是我認爲它不會影響上述問題。

+2

請提供可重複的問題/例如,或給予什麼樣的問題的數據集看起來有些跡象喜歡和你期望的樣子。仔細閱讀本文,以獲取有關可重現實例的靈感。 http://stackoverflow.com/questions/5963269/how-to-make-a-great-r-reproducible-example – Drj

回答

1

有一個fill=選項,允許您選擇要用來「填補」空白的值。可悲的是,它也取代了原來的NA,因此毫無用處。

這是一個不合理的解決方案,它使用原始測試數據來消除原本不存在的情況。

注意:我不得不稍微修改你的代碼以使其工作。

test <- read.table(text = 
'ID kypermno fyyyyq ROE_Q 
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', 
header = TRUE) 
test <- test[,-1] 

library(tidyr) 
dat_wide <- spread(test, kypermno, ROE_Q) 
dat_wide 

dat_long <- gather(dat_wide, key = 'kypermno', value = ROE_Q, -fyyyyq) 
dat_long 


# Keep only the original data 
dat_long[ paste(dat_long[,2], dat_long[,1]) %in% paste(test[,1], test[,2]),] 

# Alternative (shorter and probably better) 
merge(test[,1:2], dat_long, all.x=TRUE) 

但是,也許你應該問自己是否真的有必要在寬格式轉換數據...

+0

我處理了這個問題,用一封信替換原來的NAs,當我從寬到長回到我可以省略NAs,並用「新」長格式的NAs再次替換該字母。我不得不採用寬格式,因爲我必須計算每種庫存隨時間的60個季度ROE標準差(至少有12次未丟失觀察值),而且我沒有看到用長格式。 – kayB