I have the following dataframe df:
a<-c("Red","Red","Green","Red")
b<-c(1,1,1,1)
df<-data.frame(a,b)
I would like to 1 to b when the row of a is Red and -1 when it is Green. What's the best way of doing this?
CodePudding user response:
This can be done with a logical vector itself
df$b <- with(df, b (a == "Red") - (a == 'Green'))
-output
> df
a b
1 Red 2
2 Red 2
3 Green 0
4 Red 2
Or if there are only two unique values in 'a' column, use ifelse
df$b <- with(df, ifelse(a == 'Red', b 1, b - 1))
data
df <- data.frame(a, b)
CodePudding user response:
library(tidyverse)
df <- tibble(
a = c("Red","Red","Green","Red"),
b = c(1,1,1,1)
)
df %>%
mutate(b = case_when(a == "Red" ~ b 1,
a == "Green" ~ b - 1,
TRUE ~ b))
#> # A tibble: 4 x 2
#> a b
#> <chr> <dbl>
#> 1 Red 2
#> 2 Red 2
#> 3 Green 0
#> 4 Red 2
Created on 2022-07-03 by the reprex package (v2.0.1)
CodePudding user response:
Here is a data.table
option:
library(data.table)
setDT(df)[, b := fcase(a == "Red", b 1,
a == "Green", b - 1, rep_len(TRUE, length(b)), b)]
Output
a b
1: Red 2
2: Red 2
3: Green 0
4: Red 2
Data
df <- structure(list(a = c("Red", "Red", "Green", "Red"), b = c(1,
1, 1, 1)), class = c("tbl_df", "tbl", "data.frame"), row.names = c(NA,
-4L))