Я уверен, что я не единственный, кто задал этот вопрос, но после долгих поисков без удачи мне нужно задать вопрос самому.
У меня есть df (rp) примерно так:
rp <- structure(list(agec1 = c(7, 16, 11, 11, 17, 17),
agec2 = c(6, 12, 9, 9, 16, 15),
agec3 = c(2, 9, 9, 9, 14, NA),
agec4 = c(NA, 7, 9, 9, 13, NA),
agec5 = c(NA, 4, 7, 7, 10, NA),
agec6 = c(NA, NA, 6, 6, 9, NA),
agec7 = c(NA, NA, NA, NA, 7, NA),
agec8 = c(NA, NA, NA, NA, 5, NA),
row.names = c(NA, -6L), class = c("tbl_df", "tbl", "data.frame"))
Где каждый obs в agecX относится к возрасту детей родителей до 8 детей. Я хотел бы создать новую колонку "agec5_12", которая содержит возраст самого старшего ребенка в возрасте 5-12 лет. Так что мой df будет выглядеть так:
rpage <- structure(list(agec1 = c(7, 16, 11, 11, 17, 17),
agec2 = c(6, 12, 9, 9, 16, 15),
agec3 = c(2, 9, 9, 9, 14, NA),
agec4 = c(NA, 7, 9, 9, 13, NA),
agec5 = c(NA, 4, 7, 7, 10, NA),
agec6 = c(NA, NA, 6, 6, 9, NA),
agec7 = c(NA, NA, NA, NA, 7, NA),
agec8 = c(NA, NA, NA, NA, 5, NA),
agec5_12 = c(7, 12, 11, 11, 10, NA))
row.names = c(NA, -6L), class = c("tbl_df", "tbl", "data.frame"))
Примечания о моих данных:
- Возраст не всегда в одном и том же хронологическом порядке, то есть от младшего к старшему или от старшего к младшему
- Возможно, что в этом ряду не может быть детей в этом диапазоне (в таком случае я бы хотел, чтобы NA возвратили)
Я попытался написать функцию и применить ее, используя rowwise
и mutate
:
fun.age5_12 <- function(x){
x[which(x == max(x[(x > 4) & (x < 13)], na.rm = TRUE))]
}
rpage <- rp %>%
select(-c(20:21, 199:200)) %>%
rowwise() %>%
mutate(agec5_12 = fun.age5_12(c(1:8)))
Однако, это возвращает все obs как "12". В идеале я хотел бы сделать это с помощью dplyr. Все предложения, использующие mutate
или ifelse
и не обязательно с функциями, подойдут.
Спасибо