У меня есть такой набор данных:
dat<- data.frame(var1= c(1:15),
var2= c(rep("A", 4), "control", rep("B", 4),"control", rep("C", 4), "control"),
var3= rep(c("full","full", "half", "half", "control"),3),
value= c(12, 62, 60, 61, 83, 97,1, 22, 99, 47, 63, 49, 25, 81, 26))
dat
Я для каждого level(var3)=="control"хочу добавить эти строки на каждый уровень dat$var2. Фрейм данных результата будет выглядеть так:
res<- data.frame(var1= c(1:21),
var2= c(rep("A", 7), rep("B", 7), rep("C", 7)),
var3= rep(c("full","full", "half", "half", "control","control", "control"),3),
value= c(12, 62, 60, 61, 83, 47, 26,97,1, 22, 99,83, 47, 26, 63, 49, 25, 81,83, 47,26))
res
Решение проблемы
Вот один из вариантов
library(dplyr)
datsub <- dat %>%
filter(var3 == "control") %>%
select(var3, value)
out <- dat %>%
filter(var3!= 'control') %>%
group_by(var2) %>%
group_modify(~.x %>% bind_rows(datsub)) %>%
ungroup %>%
mutate(var1 = row_number()) %>%
select(names(dat))
-проверка с ожидаемым результатом
> all.equal(out, res, check.attributes = FALSE)
[1] TRUE
Комментариев нет:
Отправить комментарий