使用 Apply family 函数创建多个新数据框
Use Apply family function to create multiple new dataframe
我是 R 编程语言的新手,目前正在处理一些财务数据。这个问题描述起来有点复杂,所以我觉得还是一步一步来比较好。
首先这是主数据框的一小部分(命名为:log_return)我正在处理:
Date AUS.Yield BRA.Yield CAN.Yield CHI.Yield GER.Yield JAP.Yield
1 2008-01-01 NA NA NA NA NA NA
2 2008-01-02 NA NA NA NA NA NA
3 2008-01-03 -0.033047602 -0.01239795 0.003828977 -0.017857617 -0.031966192 NA
4 2008-01-04 -0.003922215 0.00198792 -0.008443187 0.006734032 -0.006984895 NA
5 2008-01-05 NA NA NA NA NA NA
6 2008-01-06 NA NA NA NA NA NA
然后我想为每个具有特定名称的列创建一个时间序列,例如:
AUS <- xts(log_return$AUS.Yield, log_return$Date)
BRA <- xts(log_return$BRA.Yield, log_return$Date)....
等等。无论如何我可以使用 for 循环或应用函数来创建它们而不是一个一个地输入?
我在想也许我可以创建一个名称为 AUS、BRA 等的数据框列表,然后使用 for 循环将时间序列分配给这些名称。不确定这是否是正确的方法。
非常感谢!!!!!
使用 lapply 创建 data.frame(动物园对象)列表的快速方法:
library(zoo)
df_list <- lapply(names(df)[-1], function(x){
zoo(df[,c("Date", x)])
})
然后一一访问您的data.frame:
> df_list[[1]]
Date AUS.Yield
1 2008-01-01 <NA>
2 2008-01-02 <NA>
3 2008-01-03 -0.033047602
4 2008-01-04 -0.003922215
5 2008-01-05 <NA>
6 2008-01-06 <NA>
数据:
df <- structure(list(Date = c("2008-01-01", "2008-01-02", "2008-01-03",
"2008-01-04", "2008-01-05", "2008-01-06"), AUS.Yield = c(NA,
NA, -0.033047602, -0.003922215, NA, NA), BRA.Yield = c(NA, NA,
-0.01239795, 0.00198792, NA, NA), CAN.Yield = c(NA, NA, 0.003828977,
-0.008443187, NA, NA), CHI.Yield = c(NA, NA, -0.017857617, 0.006734032,
NA, NA), GER.Yield = c(NA, NA, -0.031966192, -0.006984895, NA,
NA), JAP.Yield = c(NA, NA, NA, NA, NA, NA)), .Names = c("Date",
"AUS.Yield", "BRA.Yield", "CAN.Yield", "CHI.Yield", "GER.Yield",
"JAP.Yield"), class = "data.frame", row.names = c("1", "2", "3",
"4", "5", "6"))
这是另一种更传统的循环方式:
for (i in 2:length(log_return)) {
assign(names(log_return[i]), xts(log_return[i], log_return$Date))
}
这将为 data.frame 中的每个列名称创建一个 xts
对象 -- 即,一个名为 AUS.Yield
、BRA.Yield
的 xts
对象等...
我是 R 编程语言的新手,目前正在处理一些财务数据。这个问题描述起来有点复杂,所以我觉得还是一步一步来比较好。
首先这是主数据框的一小部分(命名为:log_return)我正在处理:
Date AUS.Yield BRA.Yield CAN.Yield CHI.Yield GER.Yield JAP.Yield
1 2008-01-01 NA NA NA NA NA NA
2 2008-01-02 NA NA NA NA NA NA
3 2008-01-03 -0.033047602 -0.01239795 0.003828977 -0.017857617 -0.031966192 NA
4 2008-01-04 -0.003922215 0.00198792 -0.008443187 0.006734032 -0.006984895 NA
5 2008-01-05 NA NA NA NA NA NA
6 2008-01-06 NA NA NA NA NA NA
然后我想为每个具有特定名称的列创建一个时间序列,例如:
AUS <- xts(log_return$AUS.Yield, log_return$Date)
BRA <- xts(log_return$BRA.Yield, log_return$Date)....
等等。无论如何我可以使用 for 循环或应用函数来创建它们而不是一个一个地输入?
我在想也许我可以创建一个名称为 AUS、BRA 等的数据框列表,然后使用 for 循环将时间序列分配给这些名称。不确定这是否是正确的方法。
非常感谢!!!!!
使用 lapply 创建 data.frame(动物园对象)列表的快速方法:
library(zoo)
df_list <- lapply(names(df)[-1], function(x){
zoo(df[,c("Date", x)])
})
然后一一访问您的data.frame:
> df_list[[1]]
Date AUS.Yield
1 2008-01-01 <NA>
2 2008-01-02 <NA>
3 2008-01-03 -0.033047602
4 2008-01-04 -0.003922215
5 2008-01-05 <NA>
6 2008-01-06 <NA>
数据:
df <- structure(list(Date = c("2008-01-01", "2008-01-02", "2008-01-03",
"2008-01-04", "2008-01-05", "2008-01-06"), AUS.Yield = c(NA,
NA, -0.033047602, -0.003922215, NA, NA), BRA.Yield = c(NA, NA,
-0.01239795, 0.00198792, NA, NA), CAN.Yield = c(NA, NA, 0.003828977,
-0.008443187, NA, NA), CHI.Yield = c(NA, NA, -0.017857617, 0.006734032,
NA, NA), GER.Yield = c(NA, NA, -0.031966192, -0.006984895, NA,
NA), JAP.Yield = c(NA, NA, NA, NA, NA, NA)), .Names = c("Date",
"AUS.Yield", "BRA.Yield", "CAN.Yield", "CHI.Yield", "GER.Yield",
"JAP.Yield"), class = "data.frame", row.names = c("1", "2", "3",
"4", "5", "6"))
这是另一种更传统的循环方式:
for (i in 2:length(log_return)) {
assign(names(log_return[i]), xts(log_return[i], log_return$Date))
}
这将为 data.frame 中的每个列名称创建一个 xts
对象 -- 即,一个名为 AUS.Yield
、BRA.Yield
的 xts
对象等...