Example data
library(tidyverse)
df <- tibble(
value = c(10, 50, 80, 90, 45),
value_1 = c(90, 20, 55, 30, 15)
)
# A tibble: 5 × 2
value value_1
<dbl> <dbl>
1 10 90
2 50 20
3 80 55
4 90 30
5 45 15
90 in value_1
exists in the column value
. I want to mutate another column result
that takes value_1
in that identified row where value_1
is matched with value
. If the data does not exist in the column value
, simply result would equal to value_1
Such that the output would look like:
# A tibble: 5 × 3
value value_1 result
<dbl> <dbl> <dbl>
1 10 90 30
2 50 20 20
3 80 55 55
4 90 30 30
5 45 15 15
What I have tried so far is mutate
with case_when
but I do not know how to incorporate which
or whatever to complete the script
df %>%
mutate(result = case_when(value_1 %in% value ~ 1,
TRUE ~ 0))
# A tibble: 5 × 3
value value_1 result
<dbl> <dbl> <dbl>
1 10 90 1
2 50 20 0
3 80 55 0
4 90 30 0
5 45 15 0
CodePudding user response:
Using match
you could do:
library(dplyr)
df |>
mutate(result = value_1[match(value_1, value)],
result = coalesce(result, value_1))
#> # A tibble: 5 × 3
#> value value_1 result
#> <dbl> <dbl> <dbl>
#> 1 10 90 30
#> 2 50 20 20
#> 3 80 55 55
#> 4 90 30 30
#> 5 45 15 15
or using a left_join
:
df |>
left_join(rename(df, result = value_1), by = c("value_1" = "value")) |>
mutate(result = coalesce(result, value_1))
#> # A tibble: 5 × 3
#> value value_1 result
#> <dbl> <dbl> <dbl>
#> 1 10 90 30
#> 2 50 20 20
#> 3 80 55 55
#> 4 90 30 30
#> 5 45 15 15
CodePudding user response:
You can use this function fn
fn <- function(x){
y <- which(df$value_1[x] == df$value)
if(length(y) > 0) return(df$value_1[y])
else return(df$value_1[x])
}
df$result <- sapply(1:nrow(df) , fn)
df
output
# A tibble: 5 × 3
value value_1 result
<dbl> <dbl> <dbl>
1 10 90 30
2 50 20 20
3 80 55 55
4 90 30 30
5 45 15 15
CodePudding user response:
Where you have 1, use value_1
But, you expected result makes no sense for what you describe.