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
  • A mathematical way of doing this: `df$value <- df$value * (2 * (df$gender != 'm') - 1)` – Jaap Mar 06 '18 at 18:21

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
  • 610
  • 2
  • 7
  • 22
1

consider ifelse(), like so:

df$value <- ifelse(df$gender == 'm', df$value * -1, df$value)
93i7hdjb
  • 1,136
  • 1
  • 9
  • 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
  • 5,061
  • 19
  • 47
0

Or use with().

df$value <- with(df, ifelse(gender == "m", value - 1, value))
jay.sf
  • 60,139
  • 8
  • 53
  • 110