2014-10-27 184 views
0

我有一個面板,看起來像比較嵌套循環

df <-read.table(text=" 
preis10_6 akt_datum10_6 preis11_6 akt_datum11_6 
1.55  10.06.2014 1.45  10.06.2014 
1.56  09.06.2014 1.49  11.06.2014 
",header=TRUE,sep="") 

在奇數列(preise)包含收集在那一天,而偶數列(akt_datum)包含信息的價格與列標題進入細胞關於數據的話題性。因此,當df[2, 2]09.06.2014這意味着df[1:2, 2]中的信息是從前一天開始的。我想設置這些案例NA

這是我迄今所做的:

# Instrall stringr for the function str_sub 
require(stringr) || install.packages("stringr") 

# Get indices for the columns with topicality information 
spalten <- seq(2, length(df), 2) 

# Loop over these columns 
for (spalte in spalten) { 

    # Construct the benchmark date from the column name 
    splitter <- str_sub(names(df)[spalte], 10, -1) 
    splitter <- strsplit(splitter, "_") 
    # Account for the case where the column name is in short time format (no trailing 0) 
    splitter[[1]][1] <- ifelse(nchar(splitter[[1]][1])==1, 
          paste0("0", splitter[[1]][1]), 
          splitter[[1]][1] 
) 
    splitter[[1]][2] <- ifelse(nchar(splitter[[1]][2])==1, 
          paste0("0", splitter[[1]][2]), 
          splitter[[1]][2] 
) 
    date <- paste(splitter[[1]][1], splitter[[1]][2], "2014", sep=".") 

    # Loop over all rows in the actual column 
    for (zeile in 1:nrow(df)) { 
    # and set the cell and the one before equal to NA 
    ifelse(df[zeile, spalte]!=date, df[zeile, spalte] <- df[zeile, spalte-1] <- NA, "") 
    } 

} 

這工作,但需要年齡,因爲我有事實933x324面板。也就是說,我每天有933個價格和時事信息,總共162天,這使得162個價格熱門對= 324列。

我該如何使此過程更快?

回答

2

這是做你想做的嗎?至少它可以產生與你的代碼相同的輸出(以換算的日期爲模)。

# Read data example 
df <-read.table(text=" 
preis10_6 akt_datum10_6 preis11_6 akt_datum11_6 
1.55  10.06.2014 1.45  10.06.2014 
1.56  09.06.2014 1.49  11.06.2014 
",header=TRUE,sep="") 

# Convert to date (to allow for comparison between dates) 
df$akt_datum10_6 <- as.Date(df$akt_datum10_6, "%d.%m.%Y") 
df$akt_datum11_6 <- as.Date(df$akt_datum11_6, "%d.%m.%Y") 

# Check which date is first, and substitute `NA`s 
first <- df$akt_datum10_6 < df$akt_datum11_6 
df[first, 1:2] <- NA 
df[!first, 3:4] <- NA 
print(df) 
#preis10_6 akt_datum10_6 preis11_6 akt_datum11_6 
#1  1.55 2014-06-10  NA   <NA> 
#2  NA   <NA>  1.49 2014-06-11 
+0

看起來不錯,但我怎麼能擴大到933行和324列的情況? – MERose 2014-10-27 11:52:52

+0

@MERose它應該適用於擴展行數的情況。但是,您需要修改它以完成更多列所需的操作。我發現你的帖子不清楚你想在這種情況下做什麼。也許你澄清你想要什麼,並擴大你的數據示例了一下? – 2014-10-27 11:56:43

+0

完成。它基本上是更多觀察(每天行)和更多天(具有價格和時事性質的專題信息的專欄)。 – MERose 2014-10-27 16:12:32