2017-08-05 130 views
0
中間自動更新

請看看這個簡單的數據幀:循環索引在迭代

1 4 a 2 5 b 3 6 c 4 7 d 5 8 e 6 9 f 7 10 g

忽略的第三列現在。我想創建一個帶有二進制變量的第四列,表示特定行是前一行的延續。

讓我說明,

1 4 a 1 2 5 b 0 3 6 c 0 4 7 d 1 5 8 e 0 6 9 f 0 7 10 g 1

第一行,我們開始用「1變爲4」,這是我們的基礎,路徑的起點。 在下一行我們有「2到5」,但由於我們已經在4,所以2號不是一個延續,所以第4列得到一個「0」。這一行被我們的基地放棄了。 在下一行「3到6」,由於我們已經在4,我們應該重新開始,因此我們應該從4開始重新啓動。

這就是接下來發生的情況......「4轉到7」連接第一行並因爲第四列獲得「1」。 同樣,只有行「7去10」重新連接路徑,並獲得「1」最終我想篩選「1」,因爲字母列有重要的信息。但dplyr很容易。忘掉它。

我的失敗方法是這樣的:我創建了一個循環與i和j,這將搜索時,列2中的值將等於列1中的值,進一步下降。問題是例如行「2去5」也連接行「5去8」,並會收到一個「1」

我看不到如何指示循環找到第一個連接,「4走7」,使用該發現作爲新的基地。只有這樣,下一個積極的回報是以7開頭的行。

我的頭疼。我希望有一個頭腦冷靜的人能夠向我展示光明。

謝謝你們。

回答

0

使用R中一個簡單的循環將是另一種嘗試:

x <- 1:7 
y <- 4:10 

largest_nr <- min(x, y) # to get a 1 in the first entry 
res_vec <- c() # empty vector 

# loop through the numbers and check if we have a new largest number 
for (i in 1:length(x)) { 
if (min(x[i], y[i]) >= largest_nr) { 
    # new largest number found 
    largest_nr <- max(x[i], y[i]) 
    res_vec <- c(res_vec, 1) 
} else { 
    # no new largest number found 
    res_vec <- c(res_vec, 0) 
} 
} 

cbind(x, y, res_vec) 
#>  x y res_vec 
#> [1,] 1 4  1 
#> [2,] 2 5  0 
#> [3,] 3 6  0 
#> [4,] 4 7  1 
#> [5,] 5 8  0 
#> [6,] 6 9  0 
#> [7,] 7 10  1 
0

首先你的數據集例如:

dat <- 
structure(list(X = 1:7, Y = 4:10, Z = c("a", "b", "c", "d", "e", 
"f", "g")), .Names = c("X", "Y", "Z"), class = "data.frame", row.names = c(NA, 
-7L)) 

現在嘗試以下。

next_one <- function(dat, curr){ 
    # Get the connect point from the second column 
    i <- dat[curr, 2] 
    # Now a vector of potential continuations 
    i <- which(dat[, 1] >= i) 
    # If there's a continuation, it's the first, 
    # else we're at the end of the column 
    i <- if(length(i) >= 1) i[1] else 0L 
    i 
} 

W <- integer(nrow(dat)) 
W[1] <- 1L 
curr <- 1 

while(curr <= nrow(dat)){ 
    i <- next_one(dat, curr) 
    if(i){ 
     W[i] <- 1L 
     curr <- i 
    }else 
     break 
} 

new_dat <- cbind(dat, W) 
new_dat 
    X Y Z W 
1 1 4 a 1 
2 2 5 b 0 
3 3 6 c 0 
4 4 7 d 1 
5 5 8 e 0 
6 6 9 f 0 
7 7 10 g 1 
+0

大衛的回答是有點更簡單,使之更靈活的測試原始數據。儘管如此,我從長遠來看也是如此,所以我很感謝你的解決方案。我會仔細研究你的代碼,以便表示對你的努力的讚賞,但是也爲我的知識增加一個技巧。也許你可以解釋「next_one」函數是如何工作的。它似乎比基礎教程更先進。順便說一句,我不能upvote你的答案,因爲我沒有足夠的聲望點。 –

+0

@RandomLuck不要擔心選票,他們不會打動我的孫子。至於關於函數如何工作的解釋,我將編輯我的代碼幷包含註釋。 –