Цикл над строковыми символами в R

#r #loops #for-loop

#r #циклы #для цикла

Вопрос:

Я пытаюсь перебрать список символов:

 covariate_names <- c("Age_50.", "Age_30.49", "Age_18.29", "Income_High", "Income_Medium", "Income_Low",
                "DemographicSegment_Value.Seeker", "DemographicSegment_Established", "DemographicSegment_Planner", "DemographicSegment_Affluent",
                "DemographicSegment_Digital.Native","Gender_F..", "Gender_M..", "TransactionAmount",
                "TechTxns", "FashionTxns", "TravelTxns", "GamerTxns",
                "Recency", "Frequency", "Monetary", "Breadth", "Consistency", "is_donor", "donation_amt")
 
 pairs <- function(df, covariate, group){
    pwc <- pairwise_t_test(data = df,
                           formula = as.formula(paste0(covariate,"~",group)),
                           paired = FALSE )
    pwc <- as.data.frame(pwc)
    pwc <- pwc %>% rename(GroupA = group1,
                     GroupB = group2,
                     N_grpA = n1, N_grpB = n2)
pwc <- pwc[,1:7]
pwc <- pwc %>%
    mutate_if(is.numeric, round, digits = 6)
    
    #print(pwc)
}

 
 for (i in covariate_names){
    pwc_i <- pairs(df = df_test_TS, covariate = i, group = "w.contextual")
}
 

Но pairs функция возвращает df, поэтому я не знаю, можно ли для этого использовать цикл. Я просто хочу запустить функцию pairs для всех моих ковариаций в списке и иметь возможность вызывать выходные данные из каждой отдельной итерации pairs функции.

Ответ №1:

Вы можете использовать функцию :

 library(dplyr)
library(purrr)

pairs <- function(df, covariate, group){
  pwc <- pairwise_t_test(data = df,
                         formula = reformulate(group, covariate),
                         paired = FALSE )
  pwc <- as.data.frame(pwc)
  pwc %>% 
    rename(GroupA = group1,
           GroupB = group2,
           N_grpA = n1, N_grpB = n2) %>%
    select(1:7) %>%
    mutate(across(where(is.numeric), round, digits = 6))
    #For older dplyr
    #mutate_if(is.numeric, round, digits = 6)
  
}
 

а затем используйте map / lapply для получения списка в качестве вывода :

 result <- map(covariate_names, ~pairs(df_test_TS, .x, "w.contextual"))
 

Если вы хотите объединить результаты в один фрейм данных, используйте map_df :

 result <- map_df(covariate_names, ~pairs(df_test_TS, .x, "w.contextual"))
 

Ответ №2:

Вам нужно будет сохранить ваши результаты в списке, используя цикл. Вы можете попробовать следующий код:

 #Data
covariate_names <- c("Age_50.", "Age_30.49", "Age_18.29", "Income_High", "Income_Medium", "Income_Low",
                     "DemographicSegment_Value.Seeker", "DemographicSegment_Established", "DemographicSegment_Planner", "DemographicSegment_Affluent",
                     "DemographicSegment_Digital.Native","Gender_F..", "Gender_M..", "TransactionAmount",
                     "TechTxns", "FashionTxns", "TravelTxns", "GamerTxns",
                     "Recency", "Frequency", "Monetary", "Breadth", "Consistency", "is_donor", "donation_amt")
#Function
pairs <- function(df, covariate, group){
  pwc <- pairwise_t_test(data = df,
                         formula = as.formula(paste0(covariate,"~",group)),
                         paired = FALSE )
  pwc <- as.data.frame(pwc)
  pwc <- pwc %>% rename(GroupA = group1,
                        GroupB = group2,
                        N_grpA = n1, N_grpB = n2)
  pwc <- pwc[,1:7]
  pwc <- pwc %>%
    mutate_if(is.numeric, round, digits = 6)
  
  #print(pwc)
}
 

Здесь изменения:

 #List to store results
List <- list()
#Loop
for (i in 1:length(covariate_names)){
  List[[i]] <- pairs(df = df_test_TS, covariate = covariate_names[i], group = "w.contextual")
}