I'm having issues with mapply, lists, and user generated functions.
Specifically, I want to generate turn specific variables (cyl
, vs
, and carb
) into factor form, in the mtcars
dataset, which for the example is mtcars_example_df1
.
I can do this the long way:
mtcars_example_df1$cyl <- as.factor(as.character(mtcars_example_df1$cyl))
mtcars_example_df1$vs <- as.factor(as.character(mtcars_example_df1$vs))
mtcars_example_df1$carb <- as.factor(as.character(mtcars_example_df1$carb))
I want to create a function that will be used as the basis for the
mtcars_example_df1
data frame with the factored variables. Here is my plan:
- Add a
merging_column
, which is a column just an index of numbers for the rows. - Use
mapply
and the user generated function calledfunction_merging_data_frame__turn_dataset_variable_into_factor_form_with_premade_merging_column_b
to create a list of data frames with the factor transformed variable and correspondingmerging_column
only. - Turn the list into 1 data frame with just 1
merging_column
- Remove the non-factored variables from the
mtcars_example_df1
example data. - Merging the list df and the
mtcars_example_df1
data to create the desired dataset.
Unfortunately, I cannot get the user generated function to work.
### creates function to turn into factor form, with merging dataset and premade_merging_column
function_merging_data_frame__turn_dataset_variable_into_factor_form_with_premade_merging_column_b <-
# ---- NOTE: turns variable into sum contrasted version of variable
# ---- NOTE: variable_name == variable to be turned to sum contrast
# ---- NOTE: dataset_name == dataset that contains variable name
# ---- NOTE: returns data frame column only
function(variable_name, dataset_name)
{
# ---- NOTE: # changes variable_name and dataset_name to object
colmn1 <- variable_name
nm1 <- dataset_name
# ---- NOTE: inserts dataset into function
dataset_funct_object_A <-
data.frame(
get(nm1)
)
# ---- NOTE: transforms data into factor form
dataset_funct_object_A$factor_variable <- as.factor(as.character(dataset_funct_object_A[[colmn1]]))
# ---- NOTE: selects specific variables
dataset_funct_object_B <-
dataset_funct_object_A %>%
select(dataset_funct_object_A$factor_variable,
dataset_funct_object_A$merging_column)
# ---- NOTE: ## changes colnames
names(dataset_funct_object_B)[names(dataset_funct_object_B) == "factor_variable"] <- paste(colmn1)
names(dataset_funct_object_B)[names(dataset_funct_object_B) == "merging_column"] <- paste("merging_column",
colmn1,
sep="__")
# ---- NOTE: returns appropriate object
return(dataset_funct_object_B)
}
### adds merging_column to data
mtcars_example_df1$merging_column <- seq.int(nrow(mtcars_example_df1))
### uses mapply to run factor
# ---- NOTE: applies functions to appropriate variables
freq_checking_mlm_poisson_follow_up_test_marginal_emmeans_IV_condition_c <-
mapply(function_merging_data_frame__turn_dataset_variable_into_factor_form_with_premade_merging_column_b,
mtcars_example_df1_factor_variables_df$variable_factor,
mtcars_example_df1_factor_variables_df$dataset,
SIMPLIFY = FALSE)
Any advice to fix this problem is greatly appreciated.
Here is the code for the practice:
# stack overflow example
## loads appropriate packages
library(tidyverse)
## creates mtcars_example_df1
mtcars_example_df1 <- data.frame(mtcars)
## mtcars_example_df1 data
head(mtcars_example_df1)
colnames(mtcars_example_df1)
str(mtcars_example_df1)
## df with data about data frames and variables to turn into factors
mtcars_example_df1_factor_variables_df <-
data.frame(
variable_factor = c("cyl", "vs", "carb"),
dataset = "mtcars_example_df1"
)
## long way of turning into factor
### uses manual input to complete task
mtcars_example_df1$cyl <- as.factor(as.character(mtcars_example_df1$cyl))
mtcars_example_df1$vs <- as.factor(as.character(mtcars_example_df1$vs))
mtcars_example_df1$carb <- as.factor(as.character(mtcars_example_df1$carb))
### checks results
str(mtcars_example_df1$cyl)
str(mtcars_example_df1$vs)
str(mtcars_example_df1$carb)
## short way
### creates function to turn into factor form, with merging dataset and premade_merging_column
function_merging_data_frame__turn_dataset_variable_into_factor_form_with_premade_merging_column_b <-
# ---- NOTE: turns variable into sum contrasted version of variable
# ---- NOTE: variable_name == variable to be turned to sum contrast
# ---- NOTE: dataset_name == dataset that contains variable name
# ---- NOTE: returns data frame column only
function(variable_name, dataset_name)
{
# ---- NOTE: # changes variable_name and dataset_name to object
colmn1 <- variable_name
nm1 <- dataset_name
# ---- NOTE: inserts dataset into function
dataset_funct_object_A <-
data.frame(
get(nm1)
)
# ---- NOTE: transforms data into factor form
dataset_funct_object_A$factor_variable <- as.factor(as.character(dataset_funct_object_A[[colmn1]]))
# ---- NOTE: selects specific variables
dataset_funct_object_B <-
dataset_funct_object_A %>%
select(dataset_funct_object_A$factor_variable,
dataset_funct_object_A$merging_column)
# ---- NOTE: ## changes colnames
names(dataset_funct_object_B)[names(dataset_funct_object_B) == "factor_variable"] <- paste(colmn1)
names(dataset_funct_object_B)[names(dataset_funct_object_B) == "merging_column"] <- paste("merging_column",
colmn1,
sep="__")
# ---- NOTE: returns appropriate object
return(dataset_funct_object_B)
}
### adds merging_column to data
mtcars_example_df1$merging_column <- seq.int(nrow(mtcars_example_df1))
### uses mapply to run factor
# ---- NOTE: applies functions to appropriate variables
freq_checking_mlm_poisson_follow_up_test_marginal_emmeans_IV_condition_c <-
mapply(function_merging_data_frame__turn_dataset_variable_into_factor_form_with_premade_merging_column_b,
mtcars_example_df1_factor_variables_df$variable_factor,
mtcars_example_df1_factor_variables_df$dataset,
SIMPLIFY = FALSE)