查找具有特定属性的第一列

时间:2017-02-24 16:22:11

标签: r

在数据框中,经过一些计算后,所有行都以一系列0结尾,如下面的(部分)示例所示:

   X1 X2 X3 X4 X5 X6 X7 X8 X9 X10 X11 X12 X13 X14 X15
1  -9  0  0  0  0  0  0  0  0   0   0   0   0   0   0
2   4 -1  1 -1  0 -1  0  0  0   0   0   0   0   0   0
3   3  0  0  0  0  0  0  0  0   0   0   0   0   0   0
4   0  0  0  0  0  0  0  0  0   0   0   0   0   0   0
5  -3  0  0  0  0  0  0  0  0   0   0   0   0   0   0
6  -6  0  0  0  0  0  0  0  0   0   0   0   0   0   0
7   4 -4  1 -1  0 -1  0  0  0   0   0   0   0   0   0
8   3 -3  0  0  0  0  0  0  0   0   0   0   0   0   0
9   3  0  0  0  0  0  0  0  0   0   0   0   0   0   0
10  0  0  0  0  0  0  0  0  0   0   0   0   0   0   0
11 -3  0  0  0  0  0  0  0  0   0   0   0   0   0   0

但:
- 一些孤立的0可以在<0>序列开始之前出现,如第2行和第7行所示 - 某些线条完全由0组成,如第4和第10行所示 我想创建一个包含以下信息的新列:
“0系列中的哪一列开始?”
从上面的示例中,这个新列应该包含数字:

2, 7, 2, 1, 2, 2, 7, 3, 2, 1, 2

我无法弄清楚如何做到这一点...... 谢谢你的提示。

2 个答案:

答案 0 :(得分:1)

使用apply在每一行上运行rle并获取第一个索引,其中值等于零且长度大于1(序列开始)。

apply(df, 1, function(x) which(rle(x)$values == 0 & rle(x)$lengths > 1)[1] )
# [1] 2 7 2 1 2 2 7 3 2 1 2

数据

df = structure(list(X1 = c(-9L, 4L, 3L, 0L, -3L, -6L, 4L, 3L, 3L, 
0L, -3L), X2 = c(0L, -1L, 0L, 0L, 0L, 0L, -4L, -3L, 0L, 0L, 0L
), X3 = c(0L, 1L, 0L, 0L, 0L, 0L, 1L, 0L, 0L, 0L, 0L), X4 = c(0L, 
-1L, 0L, 0L, 0L, 0L, -1L, 0L, 0L, 0L, 0L), X5 = c(0L, 0L, 0L, 
0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L), X6 = c(0L, -1L, 0L, 0L, 0L, 
0L, -1L, 0L, 0L, 0L, 0L), X7 = c(0L, 0L, 0L, 0L, 0L, 0L, 0L, 
0L, 0L, 0L, 0L), X8 = c(0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 
0L), X9 = c(0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L), X10 = c(0L, 
0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L), X11 = c(0L, 0L, 0L, 
0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L), X12 = c(0L, 0L, 0L, 0L, 0L, 
0L, 0L, 0L, 0L, 0L, 0L), X13 = c(0L, 0L, 0L, 0L, 0L, 0L, 0L, 
0L, 0L, 0L, 0L), X14 = c(0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 
0L, 0L), X15 = c(0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L)), .Names = c("X1", 
"X2", "X3", "X4", "X5", "X6", "X7", "X8", "X9", "X10", "X11", 
"X12", "X13", "X14", "X15"), class = "data.frame", row.names = c(NA, 
-11L))

答案 1 :(得分:0)

这是一个简单的解决方案。可能有更复杂的但它有效。假设您的矩阵称为'x'

# make new colum and fill with zeros
x[,ncol(x)+1] <- 0

#loop through rows and note first instance of zero in new column
for(i in 1:nrow(x)){
  x[i,ncol(x)] <- grep(0, x[i,])[1]
}