2015-09-25 30 views
0

我有一個大型數據集,其模式類似於下面的dataPattern。我需要幫助的代碼來創建desiredresult數據集根據模式創建新列

library(data.table)  

V1 <- rep(c(rep("a", times = 2), letters[2:5], 
        rep("f", times = 2)), times = 2) 


V2 <- c(c(c(0.24, 0.25), 2:5, c(0.95, 1.05)), 
       c(c(0.34, 0.35), 2:5, c(1.95, 2.05))) 

(dataPattern <- data.table(V1, V2)) 

(desiredresult <- data.table(V1, V2, c(rep(c(0.24, 0.25), times = 4), 
          rep(c(0.34, 0.35), times = 4)), 
        c(rep(c(0.95, 1.05), times = 4), 
          rep(c(1.95, 2.05), times = 4)))) 

我需要幫助的desiredresult創建列V3。所述圖案如下:

如果V1 == "a"然後V3 = V2到達如果V1 != "a"我們重複前面的相應的一組V2值直到a新值 然後V2新值被放置在V3等。上述重複爲所有新值a

我也需要你的幫助的代碼在desiredresult創建列V4這類似於V3列除非它檢查是否V1 == "f"fV2值放入V4和重複它,如果V1 != "f"

我曾嘗試:

rle(dataPattern$V1 == "a") 
# Run Length Encoding 
    # lengths: int [1:4] 2 6 2 6 
    # values : logi [1:4] TRUE FALSE TRUE FALSE 

其中V1 != "a"V1 != "f"似乎是等於FALSE減去的數量的序列TRUE。這是每個a序列需要多少次重複進行,直到達到新的a

非常感謝

+0

是否「f V1!=」a「我們重複上一組數值,直到達到a的新值,然後將V2的新值置於V3」真的意味着「f V1!=」a 「我們重複上一組V1值,直到達到a的新值,然後將V2的新值置於V3」中? –

+0

Shawn,這裏是我的意思:如果在「V1」中找到「a」,則將V2的值複製到「V3」。如果在「V1」中找不到「a」,則將上述V2值重複爲「V3」,直到在「V1」中找到一個新值 –

回答

0

OK,這裏是一個更好的辦法,我認爲,得到的V2的值轉換成取決於列V1=='a'

V1 <- rep(c(rep("a", times = 2), letters[2:5], 
      rep("f", times = 2)), times = 2) 

V2 <- c(c(c(0.24, 0.25), 2:5, c(0.95, 1.05)), 
     c(c(0.34, 0.35), 2:5, c(1.95, 2.05))) 

dataPattern <- data.frame(V1, V2) 
dataPattern$V3 <- ifelse(dataPattern$V1 == "a", dataPattern$V2, NA) 
dataPattern$V4 <- ifelse(dataPattern$V1 == "f", dataPattern$V2, NA) 
for (i in 1:nrow(dataPattern)){ 
    if (dataPattern$V1[i] == "a"){ 
     tmpa <- dataPattern$V3[i] 
    } 
    if (is.na(dataPattern$V3[i])){ 
     dataPattern$V3[i] <- tmpa 
    } 
    if (dataPattern$V1[nrow(dataPattern)-(i-1)] == "f"){ 
     tmpf <- dataPattern$V4[nrow(dataPattern)-(i-1)] 
    } 
    if (is.na(dataPattern$V4[nrow(dataPattern)-(i-1)])){ 
     dataPattern$V4[nrow(dataPattern)-(i-1)] <- tmpf 
    } 
} 

輸出,我認爲這是比較正確的,根據你的既定規則,比desiredoutput

> dataPattern 
    V1 V2 V3 V4 
1 a 0.24 0.24 0.95 
2 a 0.25 0.25 0.95 
3 b 2.00 0.25 0.95 
4 c 3.00 0.25 0.95 
5 d 4.00 0.25 0.95 
6 e 5.00 0.25 0.95 
7 f 0.95 0.25 0.95 
8 f 1.05 0.25 1.05 
9 a 0.34 0.34 1.95 
10 a 0.35 0.35 1.95 
11 b 2.00 0.35 1.95 
12 c 3.00 0.35 1.95 
13 d 4.00 0.35 1.95 
14 e 5.00 0.35 1.95 
15 f 1.95 0.35 1.95 
16 f 2.05 0.35 2.05 
+0

Shawn,這不會產生「desiredresult」數據集 –

+0

正確的,解釋'V4價值觀呢?例如,直到達到'V1 =='f''時,會發生什麼?V4的第一個值?有什麼價值? 'V4 [1:6]在'.95'和'1.05'之間交替,然後這些值纔出現在'V1'中。 –

+0

與'V3'一樣''V4'也適用,除了順序相反。 V3'先搜索'a'(V1 [1:2]),然後前進到'V1 [3:8]','V4'則反向運行。 'V4'搜索'「f」(V1 [8:7]),並向後推進到「V1 [6:1]」。 –

0

這似乎工作:

dataPattern[, `:=`(
    V3 = head(V2,2), 
    V4 = tail(V2,2) 
), by=cumsum(V1 == "a" & shift(V1,type="lead") == "a")] 

結果通過了all.equal(dataPattern, desiredresult)檢查。根據您的實際使用情況,您可能需要在cumsum之內放置不同的東西。