rdataframedplyr

# Check monotonically increasing per row

I have a dataframe as the following :

``````   COL_1 COL_2 COL_3 COL_4 COL_5 COL_6
<int> <int> <int> <int> <int> <int>
1     1     1     1     1     1     1
2     1     1     1     1     1     2
3     1     1     1     1     1     3
4     1     1     1     1     1     4
5     1     2     1     1     1     5
6     1     1     1     1     1     6
7     1     3     4     5     6     7
8     1     1     1     1     1     8
9     1     1     9     1     1     9
10     1     3     5     7     9    10
``````

I'd like to filter this dataset to keep only values from `COL_1` to `COL_6` strictly increasing, so it would be as the following:

``````   COL_1 COL_2 COL_3 COL_4 COL_5 COL_6
<int> <int> <int> <int> <int> <int>
7     1     3     4     5     6     7
10     1     3     5     7     9    10
``````

EDIT : The code should be used in a function with a dynamic number of columns (which will be named from `COL_1` to `COL_N`). A "basic" code such as

``````df %>% filter(COL_6 > COL_5 & ... & COL_2 > COL_1)
``````

will not work in my situation. Thank you very much

Solution

• With a bit of work, you could use Reduce for this. For example

``````keep <- Reduce(function(x, y) {
list(y, x[[2]] & (x[[1]] < y))
}, dd, init=list(dd[[1]]-1, TRUE))[[2]]
which(keep)
# [1]  7 10
dd[keep, ]
#    COL_1 COL_2 COL_3 COL_4 COL_5 COL_6
# 7      1     3     4     5     6     7
# 10     1     3     5     7     9    10
``````

Tested with

``````dd <- read.table(text="
COL_1 COL_2 COL_3 COL_4 COL_5 COL_6
1     1     1     1     1     1     1
2     1     1     1     1     1     2
3     1     1     1     1     1     3
4     1     1     1     1     1     4
5     1     2     1     1     1     5
6     1     1     1     1     1     6
7     1     3     4     5     6     7
8     1     1     1     1     1     8
9     1     1     9     1     1     9
10     1     3     5     7     9    10", header=TRUE)
``````