Во-первых, я довольно новичок в R, и я также начинаю задавать вопросы по SO, так что терпите меня, если я задаю глупые вопросы или не соблюдаю соглашения SO.
I 'Я пытаюсь найти лучший тип подписки для нескольких пользователей на основе их прежнего поведения при вызове.До сих пор мне удавалось ок.сопоставьте 98 000 строк, чтобы рассчитать эффективные затраты с (переменным) числом типов подписки.

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

Таким образом, в месяц 2019-01
затраты на subscription_2
ниже, чем текущая подписка наUser1
, поэтому subscription2
должна быть рекомендацией.Для месяцев 2019-02
и 2019-03
рекомендации отсутствуют, так как нет типов подписки с более низкими затратами.
Для User2
тип подписки subscription_3
должен быть рекомендацией во все месяцы, поскольку эти затратывсегда ниже текущей подписки.
В настоящее время я следую за курсами на DataCamp.com, и я почти уверен, что это почти ОЧЕНЬ базовое действие в r
, но мне нужен кто-то, чтобы направить меня в правильном направлении.
Это то, что у меня пока есть:
library(dplyr)
effective.costs <- data.frame(
user = c(rep("User1", 3), rep("User2", 3)),
month = c(rep(c("2019-01", "2019-02", "2019-03"), 2)),
current_subscription = c(rep("subscription_1", 3), rep("subscription_2", 3)),
costs = c(70, 20, 50, 150, 130, 170)
)
predicted.costs <- data.frame(
user = c(rep("User1", 9), rep("User2", 9)),
month = c(rep("2019-01",3), rep("2019-02", 3), rep("2019-03", 3)),
subscription = c(rep(c("subscription_1", "subscription_2", "subscription_3"), 6)),
calculated_costs = c(
c(70, 50, 110, 20, 50, 70, 50, 80, 120),
c(190, 150, 110, 210, 130, 110, 250, 170, 110)
)
)
comparison <- merge(effective.costs, predicted.costs, by = c("user", "month"))
getRecommendation <- function(x) {
subscription <- predicted.costs %>%
filter(
calculated_costs < x['costs'] &
user == x['user'] &
month == x['month']
) %>%
arrange(calculated_costs) %>%
select(subscription)
subscription <- ifelse(
length(subscription) > 0,
as.character(subscription[1, 1]),
NA
)
# I know return is not needed, but I'm used to it... :-)
return(subscription)
}
effective.costs$recommendation <- apply(effective.costs, 1, getRecommendation)
View(effective.costs)
Самая важная часть здесь, вероятно, это функция getRecommendation
:
getRecommendation <- function(x) {
subscription <- predicted.costs %>%
filter(
calculated_costs < x['costs'] &
user == x['user'] &
month == x['month']
) %>%
arrange(calculated_costs) %>%
select(subscription)
subscription <- ifelse(
length(subscription) > 0,
as.character(subscription[1, 1]),
NA
)
# I know return is not needed, but I'm used to it... :-)
return(subscription)
}
, которую я пытаюсьна apply
на каждую строку в effective.costs
:
effective.costs$recommendation <- apply(effective.costs, 1, getRecommendation)
Хотя это дает мне правильный вывод для User2
, в настоящее время я считаю, что это совпадение, поскольку нет никаких рекомендаций для User1
, дажеесли он будет на месяц 2019-01
:

Может кто-нибудь, пожалуйста, подтолкнуть меня в правильном направлении?
Спасибо!