Skip to content

R for skip to the next row if condition met and then another condition to check

3 messages · Ashwini Patil, Rui Barradas, Adams, Jean

#
I have a dataset with many rows and columns. Below is a sample:

V7  V8  V90   1   0-1  1   -1-1  1   -1-1  0   -1-1  0   -1-1  0
-1-1  0   -1-1  1   -10   1   -10   1   -1-1  0   00   0   00   0   00
  0   00   0   00   -1  00   -1  -10   0   00   1   00   0   0

This data is saved in a matrix trboot3 What I want to do is create a loop
whereby two conditions are checked and data is altered.

   1. If there is a zero, skip to the next row.
   2. If there is same number one below another in a row, keep the first
   number and change the rest to zero.

Here is my code for the above loop:

trboot4<-trboot3
valboot<-length(trboot3[,1])for (k in 1:length(trboot3[1,])){
  for (i in 2:valboot-1){
    if (trboot3[k,i]==0) {i<-i+1}
    else{
      if(trboot3[k,i] == trboot3[k,i+1]){
        for (j in i+1:valboot){ if(trboot3[k,j] ==
trboot3[k,i]){trboot4[k,j]<-0}else{break}
          if(j==valboot){break}
        }
      }
    }
  }}

I want to save the new matrix in trboot4

basically the above sample should become:

V7  V8  V90   1   0-1  0   -10   0   00   0   00   0   00   0   00   0
  00   1   00   0   00   0   0-1  0   00   0   00   0   00   0   00
0   00   -1  00   0   -10   0   00   1   00   0   0


Thank you!
#
Hello,

Please post in plain text not in HTML, like the posting guide asks you to.
To give a data example use ?dput, like this:

dput(head(trboot3, 20))  # paste the output of this in your mail

If you have a sample of trboot4 please also use dput to post it.

Finally, I don't understand your second condition, what does "same 
number one below another in a row" mean? Is it "below" (different rows) 
or in the same row? And you say to keep the first and change the rest. 
Once again, is it the rest of the row?

Anyway I believe I have already found a problem in your code. In

for (i in 2:valboot-1)

you should try to see what exactly is 2:valboot-1. [Tip: it starts with a 1]
Maybe you meant 2:(valboot-1).

Rui Barradas

Em 04-12-2016 10:08, Ashwini Patil escreveu:
2 days later
#
This might help.

# your example data
trboot3 <- structure(c(0L, -1L, -1L, -1L, -1L, -1L, -1L, -1L, 0L, 0L, -1L,
  0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 1L, 1L, 1L, 0L, 0L, 0L, 0L,
  1L, 1L, 1L, 0L, 0L, 0L, 0L, 0L, -1L, -1L, 0L, 1L, 0L, 0L, -1L,
  -1L, -1L, -1L, -1L, -1L, -1L, -1L, -1L, 0L, 0L, 0L, 0L, 0L, 0L,
  -1L, 0L, 0L, 0L), .Dim = c(20L, 3L), .Dimnames = list(NULL, c("V7",
  "V8", "V9")))

# function to identify first occurrence of successive values in a vector
first <- function (x) {
    l <- length(x)
    y <- c(1, 1 - (x[-1] == x[-l]))
    y==1
}

# start with a matrix of zeroes, the same size as the original
trboot4 <- array(0, dim=dim(trboot3), dimnames=dimnames(trboot3))

# identify the first occurrence of successive values in each column
indx <- apply(trboot3, 2, first)

# replace these first occurrence cells with their original values
trboot4[indx] <- trboot3[indx]

trboot4

      V7 V8 V9
 [1,]  0  1  0
 [2,] -1  0 -1
 [3,]  0  0  0
 [4,]  0  0  0
 [5,]  0  0  0
 [6,]  0  0  0
 [7,]  0  0  0
 [8,]  0  1  0
 [9,]  0  0  0
[10,]  0  0  0
[11,] -1  0  0
[12,]  0  0  0
[13,]  0  0  0
[14,]  0  0  0
[15,]  0  0  0
[16,]  0 -1  0
[17,]  0  0 -1
[18,]  0  0  0
[19,]  0  1  0
[20,]  0  0  0

Jean
On Sun, Dec 4, 2016 at 4:08 AM, Ashwini Patil <ash369ster at gmail.com> wrote: