0

アイテムに関する情報を持っlength(Date_List)ている日数がありlength(ISIN_Table$ID)ます。length(ISIN_Table$ID)日ごとに(jのループ)、すべてのアイテム( )といくつかの列(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"]))
    }
  }
} 

コードは私が望む正確な出力を私に与えます、しかしそれは信じられないほど遅いです。速度を向上させる方法についてコメントをいただければ幸いです。現在のバージョンは機能しません。

アップデート:

# 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
4

1 に答える 1

1

更新 @Arunの提案に従って、分割する前に欠落している行を追加し、mapplyを完全に回避することができます

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)

temp <- expand.grid(Dates_List, ISIN_Table$ID)
names(temp) <- c("Date", "ID")

data.raw <- merge(temp, data.raw, all.x = TRUE)
data.raw[is.na(data.raw)] <- 0
data.raw
##         Date ID Bid.Price Ask.Price
## 1 2007-01-02  1       100       100
## 2 2007-01-02  2       100       100
## 3 2007-01-02  3         0         0
## 4 2007-01-03  1       100       100
## 5 2007-01-03  2       100       100
## 6 2007-01-03  3         0         0


splitdata <- split(data.raw, data.raw$Date)

splitdata
## $`2007-01-02`
##         Date ID Bid.Price Ask.Price
## 1 2007-01-02  1       100       100
## 2 2007-01-02  2       100       100
## 3 2007-01-02  3         0         0
## 
## $`2007-01-03`
##         Date ID Bid.Price Ask.Price
## 4 2007-01-03  1       100       100
## 5 2007-01-03  2       100       100
## 6 2007-01-03  3         0         0

古い答え

を使用splitしてデータを日付で分割し、を使用しmapplymerge、特定の日付にデータがないIDでも行を取得できます。

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)

splitdata <- split(data.raw, data.raw$Date)

mapply(FUN = function(x, date) merge(x, 
                          data.frame(ID = ISIN_Table$ID, 
                                     Date = rep(date, length(ISIN_Table$ID))), 
                                 all.y = TRUE), 
       splitdata, t(names(splitdata)), SIMPLIFY = FALSE)

## $`2007-01-02`
##   ID       Date Bid.Price Ask.Price
## 1  1 2007-01-02       100       100
## 2  2 2007-01-02       100       100
## 3  3 2007-01-02        NA        NA
## 
## $`2007-01-03`
##   ID       Date Bid.Price Ask.Price
## 1  1 2007-01-03       100       100
## 2  2 2007-01-03       100       100
## 3  3 2007-01-03        NA        NA
于 2013-03-08T15:48:41.647 に答える