Home > Blockchain >  how to mutate new variables with different conditions in r
how to mutate new variables with different conditions in r

Time:12-31

Say I have a df.

df = data.frame(status = c(1, 0, 0, 0, 1, 0, 0, 0),
                stratum = c(1,1,1,1, 2,2,2,2),
                death = 1:8)

> df
  status stratum death
1      1       1     1
2      0       1     2
3      0       1     3
4      0       1     4
5      1       2     5
6      0       2     6
7      0       2     7
8      0       2     8

I want to mutate a new variable named weights. And it should meet the following conditions:

  1. weights should be mutated in stratum group.
  2. the weights value should return death value when the status is 1.

What I expected should like this:

df_wanted =  data.frame(status = c(1, 0, 0, 0, 1, 0, 0, 0),
                        stratum = c(1,1,1,1, 2,2,2,2),
                        death = 1:8,
                        weights = c(1,1,1,1, 5,5,5,5))

> df_wanted
  status stratum death weights
1      1       1     1       1
2      0       1     2       1
3      0       1     3       1
4      0       1     4       1
5      1       2     5       5
6      0       2     6       5
7      0       2     7       5
8      0       2     8       5

I do not know how to write the code.

Any help will be highly appreciated!

CodePudding user response:

You may get the death value where status = 1.

library(dplyr)

df %>%
  group_by(stratum) %>%
  mutate(weights = death[status == 1]) %>%
  ungroup

The above works because there is exactly 1 value in each group where status = 1. If there are 0 or more than 1 value in a group where status = 1 thann a better option is to use match which will return NA for 0 value and return the 1st death value for more than 1 value.

df %>%
  group_by(stratum) %>%
  mutate(weights = death[match(1, status)]) %>%
  ungroup

#  status stratum death weights
#   <dbl>   <dbl> <int>   <int>
#1      1       1     1       1
#2      0       1     2       1
#3      0       1     3       1
#4      0       1     4       1
#5      1       2     5       5
#6      0       2     6       5
#7      0       2     7       5
#8      0       2     8       5
  • Related