Bilal rana
Bilal rana

Reputation: 23

How to convert some values to negative in a column

my_df <- df %>%
mutate(incExpChange= case_when(
(incNextYear == 'Higher' & INEXQ2 %in% 0:95) ~ INEXQ2,
(incNextYear == 'Lower' & INEXQ2 %in% 0:95) ~ -INEXQ2))

I have two columns 'incNextYear' & 'INEXQ2', I want to convert some positive values in 'INEXQ2' to negative in my new column when incNextYear is 'Lower'. -INEXQ2 is not working for me. What am I doing wrong?

 structure(list(rID = 1:6, region = structure(c(1L, 2L, 3L, 4L, 1L, 4L), .Label = c("West", "Northeast", "South", "Midwest"), class = "factor"), incNextYear = structure(c(1L, 1L, 1L, 2L, 1L, 2L), .Label = c("Higher", "Lower", "About the same", "DK"), class = "factor"), homeBuying = structure(c(1L, 1L, 1L, 1L, 1L, 1L), .Label = c("BAD", "GOOD", "PRO-CON"), class = "factor"), REGION = c("West", "Northeast", "South", "Midwest", "West", "Midwest"), INEXQ1 = c("Higher", "Higher", "Higher", "Lower", "Higher", "Lower"), INEXQ2 = c("2", "3", "13", "3", "6", "5"), V204 = c("BAD", "BAD", "BAD", "BAD", "BAD", "BAD")), row.names = c(NA, -6L), class = c("tbl_df", "tbl", "data.frame")) 

Upvotes: 2

Views: 218

Answers (2)

TarJae
TarJae

Reputation: 78927

We could use type.convert(as.is = TRUE)

library(dplyr)

df %>%
  type.convert(as.is = TRUE) %>% 
  mutate(incExpChange= case_when(
    (incNextYear == 'Higher' & INEXQ2 %in% 0:95) ~ INEXQ2,
    (incNextYear == 'Lower' & INEXQ2 %in% 0:95) ~ -INEXQ2))
  rID region    incNextYear homeBuying REGION    INEXQ1 INEXQ2 V204  incExpChange
  <int> <chr>     <chr>       <chr>      <chr>     <chr>   <int> <chr>        <int>
1     1 West      Higher      BAD        West      Higher      2 BAD              2
2     2 Northeast Higher      BAD        Northeast Higher      3 BAD              3
3     3 South     Higher      BAD        South     Higher     13 BAD             13
4     4 Midwest   Lower       BAD        Midwest   Lower       3 BAD             -3
5     5 West      Higher      BAD        West      Higher      6 BAD              6
6     6 Midwest   Lower       BAD        Midwest   Lower       5 BAD             -5

Upvotes: 3

navylover
navylover

Reputation: 13559

Replace

-INEXQ2 

with

INEXQ2*(-1)

Replace

(incNextYear == 'Higher' & INEXQ2 %in% 0:95)

with

((incNextYear == 'Higher') && (INEXQ2 %in% 0:95))

another expression is also changed like above.

Upvotes: 0

Related Questions