TYL
TYL

Reputation: 1637

Changing values of column based on whether another column satisfy a criteria

I want to subtract 1 from the values of column A if column B is <= 20.

A = c(1,2,3,4,5)
B = c(10,20,30,40,50)
df = data.frame(A,B)

output

  A  B
1 0 10
2 1 20
3 3 30
4 4 40
5 5 50

My data is very huge so I prefer not to use a loop. Is there any computationally efficient method in R?

Upvotes: 0

Views: 37

Answers (3)

J.R.
J.R.

Reputation: 3888

And here is a data.table solution:

library(data.table)
setDT(df)
df[B <= 20, A := A - 1]

Upvotes: 0

Ronak Shah
Ronak Shah

Reputation: 389355

You can do

df$A[df$B <= 20]  <- df$A[df$B <= 20] - 1

#  A  B
#1 0 10
#2 1 20
#3 3 30
#4 4 40
#5 5 50

We can break this down step-by-step to understand how this works.

First we check which numbers in B is less than equal to 20 which gives us a logical vector

df$B <= 20
#[1]  TRUE  TRUE FALSE FALSE FALSE

Using that logical vector we can select the numbers in A

df$A[df$B <= 20]
#[1] 1 2

Subtract 1 from those numbers

df$A[df$B <= 20] - 1
#[1] 0 1

and replace these values for the same indices in A.


With dplyr we can also use case_when

library(dplyr)

df %>%
  mutate(A = case_when(B <= 20 ~ A - 1, 
                       TRUE ~ A))

Upvotes: 3

Lennyy
Lennyy

Reputation: 6132

Another possibility:

df$A <- ifelse(df$B < 21, df$A - 1, df$A)

Upvotes: 0

Related Questions