Немного окольным путем.Я уверен, что есть более быстрый способ сделать это, но он дает вам именно то, что вы ожидаете в качестве вывода.
Шаги: когда date1 == date2 выберите row_number и заполните его после выбора.Отфильтруйте эти записи и выберите только нужные столбцы.создайте столбец, который будет использоваться в качестве заголовков в распространении, и распространите данные Instal.затем присоедините подмножество данных, чтобы получить правильное значение Capital, и объедините эту таблицу с предыдущим выбором.
library(dplyr)
library(tidyr)
df %>%
group_by(ID) %>%
mutate(rowid = row_number(),
selection = ifelse(Date1 == Date2, rowid, NA)) %>%
fill(selection) %>% # fill rowid over the rows after date1 == date2
filter(!is.na(selection)) %>%
select(ID, Date1, Instal) %>%
mutate(Installation = paste0("Instal", row_number())) %>%
spread(Installation, Instal) %>%
inner_join(df %>% filter(Date1 == Date2) %>% select(ID, Date1, Capital), .)
ID Date1 Capital Instal1 Instal2 Instal3 Instal4
1 2 a 450 15 10 0 NA
2 4 b 90 20 15 10 0
data:
df <- structure(list(ID = c(2L, 2L, 2L, 2L, 2L, 4L, 4L, 4L, 4L, 4L),
Capital = c(500L, 500L, 450L, 300L, 250L, 100L, 90L, 80L,
75L, 25L), Instal = c(25L, 20L, 15L, 10L, 0L, 25L, 20L, 15L,
10L, 0L), Date1 = c("a", "a", "a", "a", "a", "b", "b", "b",
"b", "b"), Date2 = c("b", "c", "a", "f", "z", "a", "b", "a",
"f", "z")), class = "data.frame", row.names = c(NA, -10L))