Mel
Mel

Reputation: 520

Using text in user created function as basis to create data frame from other data frame

I want to create a function that creates data frame in r from a column in another data frame, use the text from the creation of the call as the basis of the data labels in the data frame.

For example, I want to create create the following datasets for mpg and am using the mtcars dataset as the basis.

## desired dataframe 1
# ---- NOTE: creates object
mtcars_specificed_column_object_mpg <- 
  data.frame(
    mpg = mtcars$mpg,
    variable = "mpg",
    dataset = "mtcars"
  )
# ---- NOTE: displays data head
head(mtcars_specificed_column_object_mpg)
   mpg variable dataset
1 21.0      mpg  mtcars
2 21.0      mpg  mtcars
3 22.8      mpg  mtcars
4 21.4      mpg  mtcars
5 18.7      mpg  mtcars
6 18.1      mpg  mtcars
## desired dataframe 2
# ---- NOTE: creates object
mtcars_specificed_column_object_am <- 
  data.frame(
    mpg = mtcars$am,
    variable = "am",
    dataset = "mtcars"
  )
# ---- NOTE: displays data head
head(mtcars_specificed_column_object_am)
mpg variable dataset
1   1       am  mtcars
2   1       am  mtcars
3   1       am  mtcars
4   0       am  mtcars
5   0       am  mtcars
6   0       am  mtcars

I can do this by hand, but when I try to create a function, it doesn't work.

## attempt to create function
function_create_dataset_specificed_column_object <- 
function(variable_name, dataset_name) {
  # ---- NOTE: # creates data frame of variable, with unique values
  dataset_specificed_column_object <- 
    data.frame(
      variable_name = dataset_name$variable_name,
      variable = "variable_name",
      dataset = "dataset_name"
    )
  # ---- NOTE: returns appropriate object
  return(dataset_specificed_column_object)
}

### using function
function_create_dataset_specificed_column_object(mpg, mtcars)
# ---- NOTE: function does not work

Is there any way to accomplish this task? Thanks ahead of time.



R code used to create post:


# base data frame
mtcars

## list of IVs of desired data frame
mtcars_IVs_of_interest_list$IVs <- c("mpg", "am")
mtcars_IVs_of_interest_list$dataset <- c("mtcars")

## desired dataframe 1
# ---- NOTE: creates object
mtcars_specificed_column_object_mpg <- 
  data.frame(
    mpg = mtcars$mpg,
    variable = "mpg",
    dataset = "mtcars"
  )
# ---- NOTE: displays data head
head(mtcars_specificed_column_object_mpg)

## desired dataframe 2
# ---- NOTE: creates object
mtcars_specificed_column_object_am <- 
  data.frame(
    mpg = mtcars$am,
    variable = "am",
    dataset = "mtcars"
  )
# ---- NOTE: displays data head
head(mtcars_specificed_column_object_am)


## attempt to create function
function_create_dataset_specificed_column_object <- 
function(variable_name, dataset_name) {
  # ---- NOTE: # creates data frame of variable, with unique values
  dataset_specificed_column_object <- 
    data.frame(
      variable_name = dataset_name$variable_name,
      variable = "variable_name",
      dataset = "dataset_name"
    )
  # ---- NOTE: returns appropriate object
  return(dataset_specificed_column_object)
}

### using function
function_create_dataset_specificed_column_object(mpg, mtcars)
# ---- NOTE: function does not work

Upvotes: 0

Views: 25

Answers (1)

akrun
akrun

Reputation: 887741

We can extract the object name with substitute and convert it to string (deparse). Also, use [[ instead of $ to extract the column

function_create_dataset_specificed_column_object <- 

    function(variable_name, dataset_name) {
      colnm <- deparse(substitute(variable_name))
      nm1 <- deparse(substitute(dataset_name))

    dataset_specificed_column_object <- 
    data.frame(
        variable_name = dataset_name[[colnm]],
        variable = colnm,
          dataset = nm1
     )
    names(dataset_specificed_column_object)[1] <- colnm

   return(dataset_specificed_column_object)
 }

-testing

function_create_dataset_specificed_column_object(mpg, mtcars)
#    mpg variable dataset
#1  21.0      mpg  mtcars
#2  21.0      mpg  mtcars
#3  22.8      mpg  mtcars
#4  21.4      mpg  mtcars
#5  18.7      mpg  mtcars
#6  18.1      mpg  mtcars
#7  14.3      mpg  mtcars
#...

Upvotes: 1

Related Questions