请看一下这个简单的数据框:
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开头的行。
我的头疼。我希望头脑冷却的人可以向我展示光明。
谢谢你们。
答案 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