0

I am trying to modify my dataframe in R. I have to increase values in one column by one point but only if the value is <= 4.

This is the code I am using database$leaderlikeLP[database$leaderlikeLP <= 4] + 1 but it's modifying all rows, not just the ones <= 4.

Bonus: it would be ideal if I could just apply the change for the first 10 rows where database$ID <= 10.

user438383
  • 5,716
  • 8
  • 28
  • 43
Sab
  • 31
  • 5

3 Answers3

0

Using other sample data since not provided by OP (Please see How to make a great R reproducible example)

set.seed(123)
df <- data.frame(id = 1:20,
                 x = sample(-10:10, 20))

df$x <- ifelse(df$id <= 10 & df$x <= 4, df$x + 1, df$x)
Lennyy
  • 5,932
  • 2
  • 10
  • 23
  • This is likely the best solution, though note that assumes `id` is a consecutive increasing numeric variable to subset the first 10 lines - you can generalize it by `df$x[1:10] <- ifelse(df$x[1:10] <= 4, df$x[1:10] + 1, df$x[1:10])` (a bit more cumbersome) – jpsmith Mar 23 '22 at 13:34
0

You can use mutate() and if_else() from dplyr

library(dplyr)

database %>% 
  mutate(leaderlikeLP = if_else(
    condition = row_number()<=10 & leaderlikeLP <= 4,
    true = leaderlikeLP+1,
    false = leaderlikeLP))
langtang
  • 22,248
  • 1
  • 12
  • 27
0

The previous answers are cleaner, and I would use ifelse but if you wanted to use your original approach, the corrected code would be:

set.seed(05062020)
database <- data.frame(ID = paste0("K", 1:5),
                       leaderlikeLP = sample(1:10, 5))

# OP code
  # database$leaderlikeLP[database$leaderlikeLP <= 4] + 1

# Corrected code
database[database$leaderlikeLP <= 4, "leaderlikeLP"] <-  database[database$leaderlikeLP <= 4, "leaderlikeLP"] + 1

### Original
#   ID leaderlikeLP
# 1 K1            2
# 2 K2           10
# 3 K3            6
# 4 K4            8
# 5 K5            3

### New
#   ID leaderlikeLP
# 1 K1            3
# 2 K2           10
# 3 K3            6
# 4 K4            8
# 5 K5            4

If you wanted to limit it to the first n rows (i.e., 10), simply:

set.seed(05062020)
database <- data.frame(ID = paste0("K", 1:15),
                       leaderlikeLP = sample(1:10, 15, replace = TRUE))

n <- 10
database[database$leaderlikeLP <= 4, "leaderlikeLP"][1:n] <-  database[database$leaderlikeLP <= 4, "leaderlikeLP"][1:n] + 1
jpsmith
  • 11,023
  • 5
  • 15
  • 36