Not a straight forward solution, but works
library(tidyr)
a = spread(df, action_comment, action_time);
b = spread(df, action_time, action_comment);
# dropping NAs and shifting the values to left row wise
a[] = t(apply(a, 1, function(x) `length<-`(na.omit(x), length(x))))
b[] = t(apply(b, 1, function(x) `length<-`(na.omit(x), length(x))))
out = merge(a,b, by = c('id1','id2','info'))
out[, colSums(is.na(out)) != nrow(out)]
# id1 id2 info comment1 comment2 comment3 time1 time2 time3
#1 1 a info1 time1 time2 time3 comment1 comment2 comment3
#2 2 b info2 time4 time5 comment4 comment5