На самом деле это проще сделать из длинных данных, прежде чем их распространять:
dd %>% gather("key","value",-Serial_ID, -Repair_type) %>%
filter(!is.na(value)) %>% # reverse engineer original data (if the original had NAs, you'll need this row to remove them)
group_by(Serial_ID, Repair_type) %>%
mutate(key=paste0("colx",row_number())) %>% # replace key with minimal number of keys
spread(key,value) # spread again
Результат:
# A tibble: 5 x 4
# Groups: Serial_ID, Repair_type [5]
Serial_ID Repair_type colx1 colx2
<chr> <chr> <chr> <chr>
1 ID_1 Normal 15.10.2011 12.01.2012
2 ID_1 Warranty 02.02.2013 NA
3 ID_2 Normal 18.12.2014 NA
4 ID_2 Warranty 01-01-2013 NA
5 ID_n Normal 23.01.2014 NA
Если вы ДЕЙСТВИТЕЛЬНО хотите избежать всех NA, дажеесли в конце строки вам нужно заменить NA пустыми строками.Но я бы посоветовал против этого.
Вот то же решение, примененное к предоставленным вами длинным данным:
dd %>% group_by(COMM_VIN,COMM_Kind) %>%
dplyr::mutate(Cost=sum(Cost),key=paste0("colx",row_number())) %>%
spread(key,Si_DocDate)
Вы заметите, что я создаю новый столбец суммы затрат перед спредом,чтобы избежать создания нескольких строк с одинаковой комбинацией COMM_VIN / Comm_Kind.
Результат:
# A tibble: 4 x 5
# Groups: COMM_VIN, COMM_Kind [4]
COMM_VIN COMM_Kind Cost colx1 colx2
<fct> <fct> <int> <fct> <fct>
1 V1 Normal 100 2017-01-01 NA
2 V1 Warranty 200 2017-03-02 NA
3 V2 Warranty 150 2015-04-04 2017-05-22
4 V3 Normal 400 2004-05-22 2016-06-01