R 重新排列不平衡的时间序列数据
我有一个很大的不平衡数据集(大约2000只股票),由股票的回报数据组成,现在我想重新排列回报数据,所以它都在同一个日期结束 我的数据如下所示:R 重新排列不平衡的时间序列数据,r,dplyr,R,Dplyr,我有一个很大的不平衡数据集(大约2000只股票),由股票的回报数据组成,现在我想重新排列回报数据,所以它都在同一个日期结束 我的数据如下所示: Date RF STOCK-A STOCK-B STOCK-C STOCK-D 1990-11-30 0,03 0,20 0,30 -0,40 0,90 1990-12-31 0,10 0,30 0,30 -0,40 0,34 1991-01-31 0,12
Date RF STOCK-A STOCK-B STOCK-C STOCK-D
1990-11-30 0,03 0,20 0,30 -0,40 0,90
1990-12-31 0,10 0,30 0,30 -0,40 0,34
1991-01-31 0,12 0,90 0,30 -0,60 0,78
1991-02-28 0,03 0,12 0,30 NA 0,50
1991-03-31 0,04 0,14 0,30 NA 0,12
1991-04-30 0,05 0,18 0,30 NA 0,11
1991-05-31 0,03 0,00 NA NA NA
1991-06-30 0,00 0,20 NA NA NA
我的问题是,我希望所有的股票回报在1991-06-30结束,并在早期日期填写NA,所以它看起来是这样的:
Date RF STOCK-A STOCK-B STOCK-C STOCK-D
1990-11-30 0,03 0,20 NA - NA NA
1990-12-31 0,10 0,30 NA NA NA
1991-01-31 0,12 0,90 0,30 NA 0,90
1991-02-28 0,03 0,12 0,30 NA 0,34
1991-03-31 0,04 0,14 0,30 NA 0,78
1991-04-30 0,05 0,18 0,30 -0,40 0,50
1991-05-31 0,03 0,00 0,30 -0,40 0,12
1991-06-30 0,00 0,20 0,30 -0,60 0,11
data2 <- if (any(is.na(data$STOCK-B))==TRUE){
lag(data$STOCK-B, k= -sum(is.na(data$STOCK-B)))
}else {
any(is.na(data$STOCK-B)==FALSE)
lag(data$STOCK-B, k=0)
}
我试着像这样使用滞后函数:
Date RF STOCK-A STOCK-B STOCK-C STOCK-D
1990-11-30 0,03 0,20 NA - NA NA
1990-12-31 0,10 0,30 NA NA NA
1991-01-31 0,12 0,90 0,30 NA 0,90
1991-02-28 0,03 0,12 0,30 NA 0,34
1991-03-31 0,04 0,14 0,30 NA 0,78
1991-04-30 0,05 0,18 0,30 -0,40 0,50
1991-05-31 0,03 0,00 0,30 -0,40 0,12
1991-06-30 0,00 0,20 0,30 -0,60 0,11
data2 <- if (any(is.na(data$STOCK-B))==TRUE){
lag(data$STOCK-B, k= -sum(is.na(data$STOCK-B)))
}else {
any(is.na(data$STOCK-B)==FALSE)
lag(data$STOCK-B, k=0)
}
data2对于每列,将NAs与非NAs连接起来:
moveNA <- function(x) c(Filter(is.na, x), na.omit(x))
replace(data, -1, lapply(data[-1], moveNA))
另一种甚至更短的moveNA
方法是:
moveNA <- function(x) x[order(!is.na(x))]
我们可以定义一个函数来帮助排序,然后使用dplyr
包中的mutate_at
对每个列进行排序
library(dplyr)
sort_fun <- function(x){
x_NA <- x[is.na(x)]
x_non_NA <- x[!is.na(x)]
x <- c(x_NA, x_non_NA)
return(x)
}
dat2 <- dat %>%
mutate_at(vars(-Date), funs(sort_fun(.)))
dat2
# Date RF STOCK.A STOCK.B STOCK.C STOCK.D
# 1 1990-11-30 0,03 0,20 <NA> <NA> <NA>
# 2 1990-12-31 0,10 0,30 <NA> <NA> <NA>
# 3 1991-01-31 0,12 0,90 0,30 <NA> 0,90
# 4 1991-02-28 0,03 0,12 0,30 <NA> 0,34
# 5 1991-03-31 0,04 0,14 0,30 <NA> 0,78
# 6 1991-04-30 0,05 0,18 0,30 -0,40 0,50
# 7 1991-05-31 0,03 0,00 0,30 -0,40 0,12
# 8 1991-06-30 0,00 0,20 0,30 -0,60 0,11
库(dplyr)
排序乐趣我会使用apply
功能:
apply(data,2,function(x) as.numeric(x[order(!is.na(x))]))
数据
dat <- read.table(text = "Date RF STOCK-A STOCK-B STOCK-C STOCK-D
1990-11-30 0,03 0,20 0,30 -0,40 0,90
1990-12-31 0,10 0,30 0,30 -0,40 0,34
1991-01-31 0,12 0,90 0,30 -0,60 0,78
1991-02-28 0,03 0,12 0,30 NA 0,50
1991-03-31 0,04 0,14 0,30 NA 0,12
1991-04-30 0,05 0,18 0,30 NA 0,11
1991-05-31 0,03 0,00 NA NA NA
1991-06-30 0,00 0,20 NA NA NA",
header = TRUE, stringsAsFactors = FALSE)
data <-structure(list(Date = structure(1:8, .Label = c("1990-11-30",
"1990-12-31", "1991-01-31", "1991-02-28", "1991-03-31", "1991-04-30",
"1991-05-31", "1991-06-30"), class = "factor"), RF = c(0.03,
0.1, 0.12, 0.03, 0.04, 0.05, 0.03, 0), STOCK.A = c(0.2, 0.3,
0.9, 0.12, 0.14, 0.18, 0, 0.2), STOCK.B = c(0.3, 0.3, 0.3, 0.3,
0.3, 0.3, NA, NA), STOCK.C = c(-0.4, -0.4, -0.6, NA, NA, NA,
NA, NA), STOCK.D = c(0.9, 0.34, 0.78, 0.5, 0.12, 0.11, NA, NA
)), class = "data.frame", row.names = c(NA, -8L))
数据
data <-structure(list(Date = structure(1:8, .Label = c("1990-11-30",
"1990-12-31", "1991-01-31", "1991-02-28", "1991-03-31", "1991-04-30",
"1991-05-31", "1991-06-30"), class = "factor"), RF = c(0.03,
0.1, 0.12, 0.03, 0.04, 0.05, 0.03, 0), STOCK.A = c(0.2, 0.3,
0.9, 0.12, 0.14, 0.18, 0, 0.2), STOCK.B = c(0.3, 0.3, 0.3, 0.3,
0.3, 0.3, NA, NA), STOCK.C = c(-0.4, -0.4, -0.6, NA, NA, NA,
NA, NA), STOCK.D = c(0.9, 0.34, 0.78, 0.5, 0.12, 0.11, NA, NA
)), class = "data.frame", row.names = c(NA, -8L))