'How to apply functions depending on the column, and mutate into new data frame?

I came up with the idea to represent stats on a chart like this. Example of the plot. And made it like this.

df_n <- df_normalized %>%
   transmute(
     Height_x  = round(Height*cos_my(45), 2),
     Height_y  = round(Height*sin_my(45), 2),
     Weight_x  = round(Weight*cos_my(45*2), 2),
     Weight_y  = round(Weight*sin_my(45*2), 2),
     Reach_x   = round(Reach*cos_my(45*3), 2),
     Reach_y   = round(Reach*sin_my(45*3), 2),
     SLpM_x    = round(SLpM*cos_my(45*4), 2),
     SLpM_y    = round(SLpM*sin_my(45*4), 2),
     Str_Def_x = round(`Str_Def %`*cos_my(45*5), 2),
     Str_Def_y = round(`Str_Def %`*sin_my(45*5), 2),
     TD_Avg_x  = round(TD_Avg*cos_my(45*6), 2),
     TD_Avg_y  = round(TD_Avg*sin_my(45*6), 2),
     TD_Acc_x  = round(`TD_Acc %`*cos_my(45*7), 2),
     TD_Acc_y  = round(`TD_Acc %`*sin_my(45*7), 2),
     Sub_Avg_x  = round(Sub_Avg*cos_my(45*8), 2),
     Sub_Avg_y  = round(Sub_Avg*sin_my(45*8), 2))

Now I want to do this smart way, so I created a data frame with same number of rows empty_df, and later in for loop I try to mutate and array, with every iteration. So for example I want to multiply 1st column by cos(30), 2nd by cos(30*2), and so on

But...

It mutate only last column because all columns during iteration have the same name 'column'. I want to name each column by the variable column, made with paste0().

reprex_df <- structure(list(Height = c(190, 180, 183, 196, 185), 
                            Weight = c(120, 77, 93, 120, 84), 
                            Reach = c(193, 180, 188, 203, 193),
                            SLpM = c(2.45, 3.8, 2.05, 7.09, 3.17),
                            `Str_Def %` = c(58, 56, 55, 34, 44), 
                            TD_Avg = c(1.23, 0.33, 0.64, 0.91, 0), 
                            `TD_Acc %` = c(24, 50, 20, 66, 0), 
                            Sub_Avg = c(0.2, 0, 0, 0, 0)), row.names = c(NA, -5L), 
                            class = c("tbl_df", "tbl", "data.frame"))

temp <- apply(reprex_df[,1], function(x) x*cos(60), MARGIN = 2)

temp

empty_df <- data.frame(first_column = replicate(length(temp),1))

for (x in 1:8) {
  
  temp <- apply(df[,x], function(x) round(x*cos((360/8)*x),2), MARGIN = 2)
  
  column <- paste0("Column_",x)
  
  empty_df <- mutate(empty_df, column = temp)
}

Later I want to make it a function where I can pass data frame and receive data frame with X, and Y coordinates.

So, how should I make it?



Solution 1:[1]

Perhaps this helps

library(purrr)
library(stringr)
nm1 <- names(reprex_df)
nm_cos <- str_c(names(reprex_df), "_x")
nm_sin <- str_c(names(reprex_df), "_y")
reprex_df[nm_cos] <- map2(reprex_df, seq_along(nm1),
     ~ round(.x * cos(45 *.y ), 2))
reprex_df[nm_sin] <- map2(reprex_df[nm1], seq_along(nm1), 
    ~ round(.x * sin(45 *.y ), 2))

Sources

This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.

Source: Stack Overflow

Solution Source
Solution 1 akrun