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