Home > front end >  Compare dataframe columns with vectors to obtain lower and upper bounds
Compare dataframe columns with vectors to obtain lower and upper bounds

Time:06-23

I have a dataframe which represents changes in some variable. I want small changes to be 0 and big changes to be capped by a given the vector element.

I was able to achieve the first part by creating a dataframe with the vector with the minimum values, comparing it to the original dataframe and setting TRUE values to be 0. This fails for the other part, since I don't know which element of the vector to use.

Here is some sample data:

A=structure(list(V1 = c(0.108762394171208, 0.462799827801064, 0.391699776984751, 
                        0.701799504924566), V2 = c(0.226724285865203, 0.163136613089591, 
                        0.428917320212349, 0.538211710518226), V3 = c(0.929441494401544, 
                        0.0767909574788064, 0.144388129469007, 0.555204615229741)),
                        class = "data.frame", row.names = c(NA, -4L))

Amin=c(0.15,0.12,0.08)
Amax=c(0.65,0.9,0.8)

The result I want is

> A_res
         V1        V2        V3
1 0.0000000 0.2267243 0.8000000
2 0.4627998 0.1631366 0.0000000
3 0.3916998 0.4289173 0.1443881
4 0.6500000 0.5382117 0.5552046

CodePudding user response:

A possible solution, in base R:

t(apply(A, 1, \(x) ifelse(x > Amax, Amax, ifelse(x < Amin, Amin, x))))

#>             V1        V2        V3
#> [1,] 0.1500000 0.2267243 0.8000000
#> [2,] 0.4627998 0.1631366 0.0800000
#> [3,] 0.3916998 0.4289173 0.1443881
#> [4,] 0.6500000 0.5382117 0.5552046

CodePudding user response:

We can use pmin pmax for boudaries

> A[] <- t(apply(A, 1, function(x) pmin(Amax, pmax(Amin, x))))

> A
         V1        V2        V3
1 0.1500000 0.2267243 0.8000000
2 0.4627998 0.1631366 0.0800000
3 0.3916998 0.4289173 0.1443881
4 0.6500000 0.5382117 0.5552046

CodePudding user response:

A modification of @ThomasIsCoding solution would be to apply the Amax, Amin after replicating to create the lengths same and then use pmin/pmax

A[] <- pmin(Amax[col(A)], pmax(Amin[col(A)], as.matrix(A)))

-output

> A
         V1        V2        V3
1 0.1500000 0.2267243 0.8000000
2 0.4627998 0.1631366 0.0800000
3 0.3916998 0.4289173 0.1443881
4 0.6500000 0.5382117 0.5552046
  • Related