df <- structure(list(Cars = structure(3:1, .Label = c("Ford ", "Mazda", "Merc"), class = "factor"), Model = structure(c(2L, 1L, 3L), .Label = c("c", "e-class", "gt"), class = "factor"), Color = structure(1:3, .Label = c("Black ", "Blue", "Red"), class = "factor")), class = "data.frame", row.names = c(NA, -3L))
argument <- structure(list(NewVar = structure(3:2, .Label = c("", "SKU", "Vehicle"), class = "factor"), Input = structure(2:3, .Label = c("", "Cars", "Model"), class = "factor")), row.names = 1:2, class = "data.frame")
after <- structure(list(Cars = structure(3:1, .Label = c("Ford ", "Mazda", "Merc"), class = "factor"), Model = structure(c(2L, 1L, 3L), .Label = c("c", "e-class", "gt"), class = "factor"), Color = structure(1:3, .Label = c("Black ", "Blue", "Red"), class = "factor"), Vehicle = structure(3:1, .Label = c("Ford ", "Mazda", "Merc"), class = "factor"), SKU = structure(c(2L, 1L, 3L), .Label = c("c", "e-class", "gt"), class = "factor")), class = "data.frame", row.names = c(NA, -3L))
df
#> Cars Model Color
#> 1 Merc e-class Black
#> 2 Mazda c Blue
#> 3 Ford gt Red
argument
#> NewVar Input
#> 1 Vehicle Cars
#> 2 SKU Model
after
#> Cars Model Color Vehicle SKU
#> 1 Merc e-class Black Merc e-class
#> 2 Mazda c Blue Mazda c
#> 3 Ford gt Red Ford gt
I am trying to for loop through the columns and create a copy based off the "argument" data.frame
. This is what I tried but it's not really working. I have the df
, the argument, and after dputs
. Essentially, the argument has a column titled "new var", and "input".
In argument, I have "Vehicle" in the "new var" and "input" in "Cars".
This means within original df
, copy "Cars" and title it "Vehicle". List
is dynamic so I am trying to keep it in for loops based off of length of the arguments, i.e. changing if I also want color to be copied as paint.
for (i in 1:length(argument$Input) ){
df %>%
mutate( paste0(argument[i,1]) = !!as.name(argument[i,2])
}
Note, argument[i,1]
refers to the input
, so that "variable" is the new column name.
In dplyr
, this is affecting df
, so i thought !!as.name
would pull that variable that already exists i.e. "Cars" is already within before df
.
We can select the columns of interest with 'Input' column of 'argument', then use rename_at
to change the column names. The 'argument' dataset columns are factor
class, convert it to character
while doing the changes.
library(dplyr)
df %>%
mutate_at(vars(as.character(argument$Input)), list(new= ~ .)) %>%
rename_at(vars(matches('new')), ~ as.character(argument[[1]]))
# Cars Model Color Vehicle SKU
#1 Merc e-class Black Merc e-class
#2 Mazda c Blue Mazda c
#3 Ford gt Red Ford gt
If we are using the OP's for
loop with :=
, make sure to evaluate (!!
) the name strings on the lhs
of :=
library(magrittr)
for(i in seq_len(nrow(argument))){
df %<>%
mutate(!! as.character(argument[[1]][i]) :=
!! rlang::sym(as.character(argument[[2]][i])))
}
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With