Рассмотрите возможность возврата фрейма данных в вашем вызове by
, а не в вектор с одним значением, где ваши вычисления отображаются как новый столбец, а столбцы x и y удаляются, используя всеtransform()
, функция для манипулирования столбцами и последующего возврата скорректированного фрейма данных.
Затем, чтобы избежать дублирования данных (поскольку вы выполняете агрегирование), оберните результат в unique()
.Наконец, поскольку by
вернет список однорядных фреймов данных, запустите do.call(rbind, ...)
снаружи, чтобы связать все элементы вместе.
df_list <- by(t,id, function(sub)
unique(transform(sub,
sum_output = (x %*% y) / sum(y),
x = NULL,
y = NULL)
)
)
final_df <- do.call(rbind, df_list)
row.names(final_df) <- NULL
final_df
# id sum
# 1 14 5
# 2 15 6
# 3 16 7
# 4 17 8
# 5 18 9