R - цикл, чтобы выполнить код против списка фреймов данных - PullRequest
1 голос
/ 02 апреля 2019

У меня есть этот фрагмент кода, который я могу запустить для одного фрейма данных.Тем не менее, я хотел бы иметь возможность зациклить его по списку фреймов данных.

Это базовый код:

# Run RFM Analysis on df_0
df_1 <- rfm_table_order(df_0, customer = customer_id, order_date = txn_date, revenue = txn_price, analysis_date = analysis_date, 
                             recency_bins=3, frequency_bins=3, monetary_bins=3)

df_2 <- as.data.frame(df_1$rfm)

# Add weighting to the scores    
df_2$finalscore <- (df_2 $recency_score*3 + df_2 $frequency_score*2 + df_2 $monetary_score*3)/8

# Add labels according to weighted score
df_2<- df_2 %>%
mutate(segment = case_when(
  .$finalscore >= 2.5 ~ "Loyal",
  .$finalscore <= 1.5 ~ "Lapsed",
  TRUE ~ "Regular"
))

# Add the analysis date
df_2$analysis_date <- rep(analysis_date,nrow(df_2))

# Output the final dataset with required rows
df_final <- df_2[,c("customer_id","segment","analysis_date")]

df_0 выглядит так:

customer_id    txn_date    txn_price   category   
123            01/01/2019  12          a
456            01/02/2019  7           b
...

После запуска вышеуказанного кода, df_final выглядит так:

customer_id    segment     analysis_date
123            Loyals      01/05/2019
456            Loyals      01/05/2019
...

Я хотел посмотреть, как будут отличаться результаты, если я использую категорию в качестве фактора.Из-за этого я составил список фреймов данных.

cat_list <- split(df_0, as.factor(df_0$category))

Мне нужно добавить цикл, который работает со списком фреймов данных.Последний шаг в цикле должен также добавить имя фрейма данных в результат.

Желаемый вывод:

customer_id    segment   category    analysis_date
123            Loyals    a           01/05/2019
456            Loyals    b           01/05/2019
...

1 Ответ

3 голосов
/ 02 апреля 2019

Просто обобщите ваш процесс, который принимает фрейм данных в качестве входных данных и запускаете by (примерно эквивалентно split + lapply) для подстановки основного фрейма данных в категорию и передачи подмножеств в функцию.Также рассмотрим within и ifelse для добавления необходимых столбцов (базовая R или крошечная версия mutate и case_when)

Функция

my_func <- function(sub_df) {

    # Run RFM Analysis on df
    df_1 <- rfm_table_order(sub_df, customer = customer_id, order_date = txn_date,     
                            revenue = txn_price, analysis_date = analysis_date, 
                            recency_bins=3, frequency_bins=3, monetary_bins=3)

    df_2 <- within(as.data.frame(df_1$rfm), {
                # Add weighting to the scores  
               finalscore <- (recency_score*3 + frequency_score*2 + monetary_score*3)/8

               # Add labels according to weighted score
               segment <- ifelse(finalscore >= 2.5, "Loyal", 
                                 ifelse(finalscore <= 1.5, "Lapsed", "Regular")
                          )

               # Add the analysis date
               analysis_date <- analysis_date

               # Add category
               category <- sub_df$category[[1]]
          })

    # Output the final dataset with required rows
    df_final <- df_2[,c("customer_id", "segment", "category", "analysis_date")]

    return(df_final)
}

Звоните

cat_list <- by(df_0, df_0$category, my_func)

# cat_list <- lapply(split(df_0, df_0$category), my_func)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...