R-从长到宽,再回到相同的长格式

R-从长到宽,再回到相同的长格式,r,dataframe,reshape,tidyr,R,Dataframe,Reshape,Tidyr,我有长格式的Compustat数据,我通过spread(从tidyr包)将其转换为宽格式 然后我做一些计算,然后我想把数据帧恢复到长格式。是否有任何类型的“记忆”功能,以便我的新长数据帧与旧数据帧完全相同(顺序相同) 问题是,有很多NAs,每个股票的数据从股票首次上市时开始,到退市后或样本结束时结束。我的样本从1960年到2015年(每季度一次)。当然,并非所有股票都有这些日期的数据,但当我从宽幅格式回到长幅格式时,每只股票都会得到1960.1到2015.4的所有日期。这个长格式数据帧是我正在构

我有长格式的Compustat数据,我通过
spread
(从
tidyr
包)将其转换为宽格式

然后我做一些计算,然后我想把数据帧恢复到长格式。是否有任何类型的“记忆”功能,以便我的新长数据帧与旧数据帧完全相同(顺序相同)

问题是,有很多
NA
s,每个股票的数据从股票首次上市时开始,到退市后或样本结束时结束。我的样本从1960年到2015年(每季度一次)。当然,并非所有股票都有这些日期的数据,但当我从宽幅格式回到长幅格式时,每只股票都会得到1960.1到2015.4的所有日期。这个长格式数据帧是我正在构建的分数的一部分,我必须将它与其他长格式数据帧进行比较(所有长格式数据帧按kypermno和date的顺序相同),因为我需要将宽数据帧转换回与新值完全相同的原始形式

编辑:以下是我的问题示例:

长格式“原始”(称为“测试”):

`kypermno FYYYYYQ ROE\u
1      1001   1985  0.56
2      1001   1986  0.43
3      1001   1987  0.78
41001 1988年北美
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北美
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)

dat\u wide有一个
fill=
选项,允许您选择用于“填充”间隙的值。不幸的是,它也取代了原来的NA,所以它是无用的

这是一个不雅观的解决方案,使用原始测试数据来消除最初不存在的情况

NB:我不得不稍微修改一下你的代码,让它正常工作

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)

test请提供一个可重现的问题/示例,或给出一些问题数据集的外观以及您期望它的外观指示。通读这篇文章,获得一些关于可复制示例的灵感。我通过用一个字母替换原来的NAs解决了这个问题,当我从宽到长返回时,我可以省略NAs,并用“新”长格式的NAs再次替换字母。我不得不选择宽格式,因为我必须计算每只股票随时间变化的60个季度ROE标准偏差(至少有12个未遗漏的观察值),而我没有找到一种方便的方法在长格式中这样做。
 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
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)