循环索引在迭代过程中自动更新

时间:2017-08-05 16:23:15

标签: r loops for-loop foreach while-loop

请看一下这个简单的数据框:

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不是延续,所以,第四列得到" 0"。这一行被我们的基地删除。 在下一行" 3进入6",再次被取消,因为我们已经在4,我们应该重新开始4。

接下来会发生什么......" 4转到7"连接第一行,因此第四列得到" 1"。 同样,只有行" 7进入10"重新连接路径并获得" 1"

最终我想过滤" 1s"因为字母栏有重要的信息。但是使用dplyr很容易。算了吧。

我失败的方法是这样的:我用i和j创建了一个循环,当第2列中的值等于第1列中的值时,将进行搜索。问题是例如行" 2转到5"也与行连接" 5到8"并会收到" 1"

我无法看到如何在找到第一个连接时指示循环," 4变为7"将该发现用作新基础。只有这样,下一个正回报才是以7开头的行。

我的头疼。我希望头脑冷却的人可以向我展示光明。

谢谢你们。

2 个答案:

答案 0 :(得分: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

答案 1 :(得分:0)

在R中使用简单循环的另一种尝试是:

ablines