Я пытаюсь применить функцию масштабирования к data.frame группой «категория». Функция масштабирования требует определенного скаляра в зависимости от его категории. Вычисление: каждое значение «t» делится на общее число «t» на «кот», а затем умножается на скаляр, который соответствует «cat» (т.е. «fac.a» для cat = a и т. Д.), ,Получить переменную по тексту по группе для применения функции
Я использую «получить», чтобы вызвать конкретный скаляр, но только с использованием значения для 1-й линии и применяя ко всему data.frame:
# my scaling factors:
fac.a <- 15
fac.b <- 12
fac.c <- 20
# dummy data.frame
set.seed(10)
df <- data.frame(t = sample(1:100,15),cat = rep(c("a","b","c"),each=5))
# apply function that groups & sums the df$t values by df$cat, divides each df$t by its
# repsective category total and applies the correct scalar with a get function.
df$scaled <- apply(df[1], 2, function(x) (df$t/ave(df$t, df$cat, FUN=sum))*get(paste0("fac.",df$cat)))
К сожалению, я только получать право ответ для 1-й категории, поскольку функция get вызывает только 1-й скаляр.
Это можно сделать с относительной легкостью в 4-5 строках (создание отдельных атрибутов и т. Д.), Но я бы хотел добиться этого в функции приложения.
N.B. почему новый атрибут, называемый «t» в data.frame, но «масштабированный», когда я просматриваю имена (df)?
да, я жадный пользователь data.table, люблю его. Но я отчаянно пытаюсь понять это в применении, используя get. Возможно, я глуп, но это проблема, которую я бы хотел решить! спасибо за ваш ответ, хотя – Sam
@Sam Я бы сказал, что лучше не использовать 'apply' здесь, поскольку есть один столбец, а' apply' преобразует вывод в 'matrix' – akrun
ok спасибо. Кроме того, ваши масштабированные цифры выглядят немного низко .... первый масштабированный результат должен быть примерно 3,8, например. Я думаю, что вы разделились на скаляр, а не на умножение, я ставлю, что это мой плохой вопрос :) – Sam