0

I have this dataframe:

gender <- c("m", "m", "f", "f")
value <- c(75, 50, 20, 80)
df <- data.frame(gender, value)
df

I want to change the values in the column "value", conditional uppon the value on column "gender".

If the target change is a fixed number or character, the mutation is straightforward:

df$value[df$gender == "m"] <- 1

However, if the target value is a mutation of the original value, like this

df$value[df$gender == "m"] <- df$value * -1

I get the following error:

> Warning message:
> In df$value[df$gender == "m"] <- df$value * -1 :
> number of items to replace is not a multiple of replacement length 

Is the conditional mutation with a variable target value possible in base R?

dbs
  • 31
  • 1

4 Answers4

1

You have different length in your code, as said in the error message. You can try this: df$value[df$gender == "m"] <- df$value[df$gender == "m"] * -1

Zhiya
  • 590
  • 1
  • 6
  • 22
1

consider ifelse(), like so:

df$value <- ifelse(df$gender == 'm', df$value * -1, df$value)
93i7hdjb
  • 1,006
  • 1
  • 8
  • 15
0

It is possible, you just have to make sure they are the same length as the error says. What you probably want to do is this:

> length(df$value[df$gender == 'm'])
[1] 2
> length(df$value)
[1] 4

df$value[df$gender == "m"] <- df$value[df$gender == "m"] * -1
C. Braun
  • 4,781
  • 16
  • 44
0

Or use with().

df$value <- with(df, ifelse(gender == "m", value - 1, value))
jay.sf
  • 46,523
  • 6
  • 46
  • 87