Ошибка длины атрибута после агрегирования фрейма данных с помощью пользовательской функции - PullRequest
0 голосов
/ 30 марта 2019

У меня была следующая функция для расчета агрегированных ежемесячных изменений в некотором столбце.

monthly_summary <- setNames(
    aggregate.data.frame(
        t_merged[,c("amount_coerced")],
        by = list(t_merged$year, t_merged$month),
        FUN = sum,
        drop = TRUE
    ), c("year", "month", "delta")

Затем я решил добавить еще несколько столбцов с результатами применения различных функций к одним и тем же данным (режим,медиана, наверное, что-то нестандартное и условное).Довольно простые вещи.

Я нашел этот ответ, и это именно то, что мне нужно.Тем не менее, когда я переписал функцию следующим образом:

monthly_summary <- setNames(
    aggregate.data.frame(
        t_merged[,c("amount_coerced")],
        by = list(t_merged$year, t_merged$month),
        FUN = function(x) c(sum(x), median(x)),
        drop = TRUE
    ), c("year", "month", "delta", "daily_median")

я получаю

Error in names(object) <- nm : 
    'names' attribute [4] must be the same length as the vector [3]

Столбцы получают имя вместо [delta.1, delta.2], а nrow (month_summary) равнотеперь вдвое больше, чем ожидалось.Я закончил тем, что сделал это вместо:

monthly_summary <-
merge(
    x = setNames(
        aggregate.data.frame(
            t_merged[,c("amount_coerced")],
            by = list(t_merged$year, t_merged$month),
            FUN = sum,
            drop = TRUE
        ), c("year", "month", "delta")
    ),
    y = setNames(
        aggregate.data.frame(
            t_merged[,c("amount_coerced")],
            by = list(t_merged$year, t_merged$month),
            FUN = median,
            drop = TRUE
        ), c("year", "month", "daily_median")
    ),
    by = c("year", "month"),
    all.x = TRUE
)

И это работает точно так, как мне нужно, но это, очевидно, супер тупой способ сделать это.Может ли кто-нибудь указать мне на очевидную ошибку / неправильное мышление здесь, пожалуйста, я застрял.

...