【发布时间】:2013-03-08 14:42:19
【问题描述】:
我有length(Date_List) 的天数,我有关于length(ISIN_Table$ID) 项目的信息。
对于每一天(j 中的循环),我创建一个零数据框,可以容纳所有项目 (length(ISIN_Table$ID)) 和一些列 (4)。
每个项目将是每个矩阵中的一行,但根据日期会有不同的填充。
#create list that will hold matrices
df.list<-vector("list", length(Dates_List))
for (j in 1:(length(Dates_List))){
df.list[[j]] <- data.frame(matrix(0, nrow = length(ISIN_Table$ID),ncol=4))
}
#Loop over number of days
for (j in 1:(length(Dates_List))){
date<-Dates_List[j]
#create empty dataframe
df.list[[j]] <- data.frame(matrix(0, nrow=length(ISIN_Table$ID), ncol=4))
#loop over every item
for (i in 1:(length(ISIN_Table$ID))){
#check whether item is known at date
if (nrow(data.raw[data.raw$ID==i & data.raw$Date==date,]) < 1){
ID<-i
df.list[[j]][i,1]<-date
df.list[[j]][i,2]<-ID #fill up the row
}
else{
#fill up the row
df.list[[j]][i,]<-c(
as.character(data.raw[data.raw$ID==i & data.raw$Date==date,"Date"]),
(data.raw[data.raw$ID==i & data.raw$Date==date,"ID"]),
(data.raw[data.raw$ID==i & data.raw$Date==date,"Bid.Price"]),
(data.raw[data.raw$ID==i & data.raw$Date==date,"Ask.Price"]))
}
}
}
代码为我提供了我想要的确切输出,但是速度非常慢。我会很感激任何关于如何提高速度的 cmets,当前版本不可行。
更新:
# create dummy data:
Dates_List<-c("2007-01-02", "2007-01-03")
ISIN_Table<-data.frame(c(1,2,3))
colnames(ISIN_Table)<-"ID"
ID<-rep(1:2, len=2, each=1)
Date<-c("2007-01-02","2007-01-02","2007-01-03", "2007-01-03")
Bid.Price<-rep(100,4)
Ask.Price<-rep(100,4)
data.raw<-data.frame(ID, Date, Bid.Price, Ask.Price)
要求 df.list[[1]] 返回:
X1 X2 X3 X4
1 2007-01-02 1 100 100
2 2007-01-02 2 100 100
3 2007-01-02 3 0 0
【问题讨论】:
-
R 中的 for 循环很慢。你可以试试
apply家庭功能。同样没有可重复的数据,很难回答这样的问题。 -
看起来您只是想按日期拆分 data.raw,如果您在任何特定日期都没有任何特定的
ID,则使用 0 填充它 -
for循环并不慢。创建和子集 data.frames 很慢。 -
@Roland 我的意思是在 R 中完成工作有比使用 for 循环更好的方法:)
-
@Smackboyg,最好通过提供示例数据(
data.raw例如?)并向我们展示您需要的输出。你会得到更好的解决方案。因此,这个问题没有建设性(或过于本地化),如果仍然如此,过一段时间,我会投票结束。
标签: performance r dataframe apply