Часть "гистограмма как текст" сбивает меня с толку, но я предполагаю, что вы действительно хотите сделать табулирование в течение одной секунды:
df_diff$tdiff_grp <- cut(df_diff$TIME_DIFF, 0:10, right=FALSE)
with(df_diff, tapply(tdiff_grp, SOURCE, table))
$A
[0,1) [1,2) [2,3) [3,4) [4,5) [5,6) [6,7) [7,8) [8,9) [9,10)
0 2 0 0 0 0 0 0 0 0
$D
[0,1) [1,2) [2,3) [3,4) [4,5) [5,6) [6,7) [7,8) [8,9) [9,10)
0 1 0 1 0 0 0 0 0 0
После того, как вы укажете, что на самом деле является желаемым, было бы просто использовать prop.table или делить их на их суммы (а затем умножить на 100) для получения процентов.
РЕДАКТИРОВАТЬ: простая функция может возвращать проценты:
> tbls <- with(df_diff, tapply(tdiff_grp, SOURCE,table))
> lapply(tbls, function(x) 100*x/sum(x) )
$A
[0,1) [1,2) [2,3) [3,4) [4,5) [5,6) [6,7) [7,8) [8,9) [9,10)
0 100 0 0 0 0 0 0 0 0
$D
[0,1) [1,2) [2,3) [3,4) [4,5) [5,6) [6,7) [7,8) [8,9) [9,10)
0 50 0 50 0 0 0 0 0 0