jeudi 2 décembre 2021

for loop remove rows until consecutive rows are the same

Hi I want to do a for loop and remove rows in a dataset until "contaminants" are gone.

Here is an example. This is a subset of a much larger data.frame. By contaminant I mean, chunks or individual FALSEs within TRUEs, and vice-versa. The loop should first remove one contaminant, then two, three, etc. until no TRUE is within FALSE and vice versa.

1.0  de  cd FALSE
1.0  cd  de FALSE
1.0  cd  de FALSE
1.1   e  cd  TRUE
1.1   e  cd  TRUE
1.1   e  cd  TRUE
1.1  cd   e  TRUE
1.2  de  cd FALSE
1.2  de  cd FALSE
1.3   e  cd  TRUE
1.3   e  cd  TRUE
1.3  bc  cd FALSE
1.3   e  cd  TRUE
1.3   e  cd  TRUE
1.3   e  cd  TRUE
1.3   e  cd  TRUE
1.3   e  cd  TRUE

I want something like this:

1.0  de  cd FALSE
1.0  cd  de FALSE
1.0  cd  de FALSE
1.1   e  cd  TRUE
1.1   e  cd  TRUE
1.1   e  cd  TRUE
1.1  cd   e  TRUE
1.3   e  cd  TRUE
1.3   e  cd  TRUE
1.3   e  cd  TRUE
1.3   e  cd  TRUE
1.3   e  cd  TRUE
1.3   e  cd  TRUE
1.3   e  cd  TRUE

The loop function should first remove row 1.3 bc cd FALSE, then both 1.2 de cd FALSE rows because all neighbors are true.

In addition, this loop will be placed within a function. I would double appreciate if it run fast.

Whole dataset:

structure(list(n = c(0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
0, 0, 0, 0, 0, 0, 0, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 
0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.2, 0.2, 0.2, 0.2, 0.2, 
0.2, 0.2, 0.2, 0.2, 0.2, 0.2, 0.2, 0.2, 0.2, 0.2, 0.2, 0.2, 0.2, 
0.2, 0.2, 0.2, 0.2, 0.2, 0.2, 0.2, 0.2, 0.2, 0.2, 0.2, 0.2, 0.2, 
0.2, 0.2, 0.2, 0.2, 0.2, 0.2, 0.2, 0.2, 0.2, 0.2, 0.2, 0.3, 0.3, 
0.3, 0.3, 0.3, 0.3, 0.3, 0.3, 0.3, 0.3, 0.3, 0.3, 0.3, 0.3, 0.3, 
0.3, 0.3, 0.3, 0.3, 0.3, 0.3, 0.3, 0.3, 0.3, 0.3, 0.3, 0.3, 0.3, 
0.3, 0.3, 0.3, 0.3, 0.4, 0.4, 0.4, 0.4, 0.5, 0.5, 0.5, 0.5, 0.6, 
0.6, 0.8, 0.8, 0.8, 0.8, 0.8, 0.8, 0.8, 0.8, 0.8, 0.8, 0.8, 0.8, 
0.8, 0.8, 0.8, 0.8, 0.8, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 
1, 1, 1, 1, 1.1, 1.1, 1.1, 1.1, 1.1, 1.1, 1.1, 1.1, 1.2, 1.2, 
1.2, 1.2, 1.3, 1.3, 1.3, 1.3, 1.3, 1.3, 1.5, 1.5, 1.5, 1.5, 2.1, 
2.1, 2.3, 2.3, 2.3, 2.3, 2.3, 2.3, 2.3, 2.3, 2.3, 2.3, 2.3, 2.3, 
2.3, 2.3, 2.3, 2.3, 2.4, 2.4, 2.5, 2.5, 2.5, 2.5, 2.5, 2.5, 2.5, 
2.5, 2.6, 2.6, 2.6, 2.6, 2.6, 2.6, 2.6, 2.6, 3.7, 3.9, 3.9, 4.5, 
4.7, 4.7, 4.7, 4.7, 4.7, 4.7, 4.7, 4.7, 4.9, 4.9, 4.9, 4.9, 5, 
5, 5, 5, 8.5, 10.9, 10.9, 12.2, 12.4, 12.4, 13, 13.2, 13.2, 13.2, 
13.2, 13.2, 13.2, 13.2, 13.2, 13.4, 13.4, 13.4, 13.4, 13.5, 13.5, 
13.5, 13.5), V2 = c("de", "de", "de", "de", "de", "e", "e", "e", 
"de", "de", "de", "de", "de", "de", "de", "e", "e", "de", "de", 
"de", "de", "de", "de", "de", "de", "de", "de", "de", "de", "bc", 
"de", "de", "de", "de", "cd", "e", "de", "de", "de", "de", "de", 
"de", "de", "de", "de", "de", "de", "de", "de", "de", "e", "e", 
"e", "e", "de", "de", "de", "de", "de", "de", "de", "de", "de", 
"de", "de", "de", "de", "de", "de", "de", "de", "de", "de", "de", 
"de", "de", "de", "de", "de", "de", "de", "de", "de", "de", "de", 
"de", "de", "de", "cde", "cde", "cde", "cde", "cde", "de", "de", 
"de", "de", "de", "cd", "cd", "e", "e", "e", "e", "e", "e", "e", 
"e", "de", "de", "de", "e", "e", "e", "e", "e", "e", "e", "de", 
"de", "de", "de", "de", "de", "e", "e", "e", "e", "de", "de", 
"de", "de", "de", "de", "de", "cde", "e", "e", "cde", "cde", 
"cde", "cde", "de", "de", "de", "de", "de", "de", "cde", "de", 
"de", "cd", "cd", "cd", "cd", "de", "cd", "cd", "cd", "de", "de", 
"de", "de", "de", "de", "de", "de", "de", "de", "de", "de", "de", 
"de", "cd", "cd", "e", "e", "e", "e", "cd", "cd", "e", "cd", 
"de", "de", "de", "de", "e", "e", "bc", "bc", "e", "cd", "bc", 
"bc", "bc", "bc", "cde", "cde", "de", "de", "de", "de", "de", 
"de", "bc", "bc", "bc", "bc", "bc", "de", "bc", "bc", "bc", "bc", 
"bc", "bc", "de", "de", "de", "de", "de", "de", "bc", "bc", "e", 
"e", "e", "e", "bc", "bc", "bc", "bc", "b", "b", "b", "cde", 
"de", "de", "de", "de", "b", "b", "b", "b", "de", "de", "de", 
"de", "e", "e", "b", "b", "b", "bc", "bc", "cd", "cd", "cd", 
"cde", "de", "de", "de", "de", "de", "de", "de", "de", "de", 
"de", "de", "de", "e", "e", "e", "e"), V3 = c("de", "de", "de", 
"de", "de", "e", "e", "e", "de", "de", "de", "de", "de", "de", 
"de", "e", "e", "de", "de", "de", "de", "de", "de", "de", "de", 
"de", "de", "de", "de", "bc", "de", "de", "de", "de", "cd", "e", 
"de", "de", "de", "de", "de", "de", "e", "e", "e", "e", "e", 
"e", "e", "e", "de", "de", "de", "de", "e", "e", "e", "e", "de", 
"de", "de", "de", "de", "de", "de", "de", "de", "de", "de", "de", 
"de", "de", "de", "de", "de", "cde", "de", "de", "de", "de", 
"de", "de", "de", "de", "cde", "de", "cde", "de", "de", "de", 
"de", "de", "de", "de", "de", "de", "de", "de", "cd", "cd", "de", 
"de", "de", "de", "de", "de", "de", "de", "e", "e", "e", "de", 
"de", "de", "de", "de", "de", "de", "e", "e", "e", "e", "e", 
"e", "de", "de", "de", "de", "e", "e", "e", "e", "cde", "cde", 
"cde", "de", "cde", "cde", "e", "e", "cd", "cd", "cd", "cd", 
"cd", "cd", "cd", "cd", "cd", "cd", "cd", "de", "de", "de", "de", 
"cd", "de", "de", "de", "cd", "cd", "cd", "cd", "cd", "cd", "cd", 
"cd", "cd", "cd", "cd", "cd", "cd", "cd", "de", "de", "cd", "cd", 
"cd", "cd", "e", "e", "cd", "e", "cd", "cd", "cd", "cd", "cd", 
"cd", "cd", "cd", "cd", "e", "cd", "cd", "cd", "cd", "bc", "bc", 
"bc", "bc", "bc", "bc", "bc", "bc", "de", "de", "de", "de", "de", 
"bc", "de", "de", "de", "de", "b", "b", "bc", "bc", "bc", "bc", 
"bc", "bc", "de", "de", "bc", "bc", "bc", "bc", "e", "e", "e", 
"e", "cd", "cd", "cd", "b", "b", "b", "b", "b", "de", "de", "de", 
"de", "b", "b", "b", "b", "b", "b", "e", "e", "a", "a", "a", 
"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", "a", "a", "a", 
"a", "a", "a", "a", "a", "a", "a"), inter = c(FALSE, FALSE, FALSE, 
FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, 
FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, 
FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, 
FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, 
FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, 
FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, 
FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, 
FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, 
FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, 
FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, 
FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, 
FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, 
FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, 
FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, 
FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, 
FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, 
FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, 
FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, 
FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, 
FALSE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, FALSE, 
FALSE, FALSE, FALSE, TRUE, TRUE, FALSE, FALSE, TRUE, TRUE, FALSE, 
FALSE, FALSE, FALSE, FALSE, FALSE, TRUE, TRUE, TRUE, TRUE, TRUE, 
TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, 
FALSE, FALSE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, 
TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, 
TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, 
TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, 
TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, 
TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE)), row.names = c(1L, 
5L, 12L, 27L, 34L, 47L, 58L, 65L, 69L, 70L, 73L, 79L, 81L, 83L, 
84L, 97L, 104L, 112L, 124L, 127L, 133L, 135L, 137L, 138L, 143L, 
149L, 151L, 153L, 154L, 173L, 191L, 193L, 195L, 196L, 234L, 247L, 
250L, 252L, 253L, 263L, 264L, 271L, 2L, 4L, 15L, 22L, 24L, 26L, 
37L, 44L, 48L, 55L, 87L, 94L, 115L, 122L, 213L, 220L, 3L, 6L, 
7L, 10L, 16L, 18L, 20L, 21L, 25L, 28L, 29L, 32L, 38L, 40L, 42L, 
43L, 68L, 71L, 75L, 106L, 107L, 110L, 116L, 118L, 120L, 121L, 
125L, 129L, 141L, 145L, 158L, 164L, 166L, 168L, 169L, 187L, 214L, 
216L, 218L, 219L, 236L, 257L, 46L, 49L, 50L, 53L, 59L, 61L, 63L, 
64L, 67L, 78L, 85L, 88L, 89L, 92L, 98L, 100L, 102L, 103L, 132L, 
139L, 148L, 155L, 190L, 197L, 241L, 243L, 245L, 246L, 254L, 265L, 
272L, 274L, 8L, 30L, 108L, 160L, 51L, 90L, 163L, 170L, 162L, 
165L, 77L, 80L, 131L, 134L, 147L, 150L, 167L, 189L, 192L, 233L, 
235L, 237L, 238L, 249L, 256L, 258L, 259L, 14L, 17L, 36L, 39L, 
82L, 114L, 117L, 136L, 152L, 194L, 212L, 215L, 251L, 262L, 267L, 
268L, 57L, 60L, 96L, 99L, 232L, 239L, 242L, 260L, 19L, 41L, 119L, 
217L, 62L, 101L, 181L, 206L, 244L, 269L, 176L, 179L, 201L, 204L, 
157L, 159L, 72L, 74L, 126L, 128L, 142L, 144L, 172L, 178L, 180L, 
182L, 183L, 186L, 203L, 205L, 207L, 208L, 175L, 200L, 9L, 11L, 
31L, 33L, 109L, 111L, 174L, 199L, 52L, 54L, 91L, 93L, 177L, 184L, 
202L, 209L, 227L, 222L, 225L, 161L, 76L, 130L, 146L, 188L, 224L, 
226L, 228L, 229L, 13L, 35L, 113L, 211L, 56L, 95L, 223L, 230L, 
231L, 185L, 210L, 270L, 240L, 261L, 171L, 86L, 140L, 156L, 198L, 
255L, 266L, 273L, 275L, 23L, 45L, 123L, 221L, 66L, 105L, 248L, 
276L), class = "data.frame")

Aucun commentaire:

Enregistrer un commentaire