简体   繁体   中英

how to mutate new variables with different conditions in r

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!

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

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM