Home > Back-end >  Assigning multiple column names at once using cbind
Assigning multiple column names at once using cbind

Time:06-04

How can I assign multiple column names at once using cbind?

# works fine
cbind(mtcars, 'new1' = apply(X = array(data = 1:64, dim = c(32, 1)),
                             MARGIN = c(1,2),
                             FUN = function(x) {return(x)}))

# works fine
cbind(mtcars, apply(X = array(data = 1:64, dim = c(32, 2)),
                    MARGIN = c(1,2),
                    FUN = function(x) {return(x)}))

# doesn't work
cbind(mtcars, c('new2', 'new3') = apply(X = array(data = 1:64, dim = c(32, 2)),
                                        MARGIN = c(1,2),
                                        FUN = function(x) {return(x)}))

CodePudding user response:

Another option is to use setNames, but you need to first wrap the apply statement in data.frame:

cbind(mtcars, setNames(data.frame(apply(X = array(data = 1:64, dim = c(32, 2)),
                                        MARGIN = c(1,2),
                                        FUN = function(x) {return(x)})), c('new2', 'new3')))

Output

     mpg   cyl  disp    hp  drat    wt  qsec    vs    am  gear  carb  new2  new3
   <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <int> <int>
 1  21       6  160    110  3.9   2.62  16.5     0     1     4     4     1    33
 2  21       6  160    110  3.9   2.88  17.0     0     1     4     4     2    34
 3  22.8     4  108     93  3.85  2.32  18.6     1     1     4     1     3    35
 4  21.4     6  258    110  3.08  3.22  19.4     1     0     3     1     4    36
 5  18.7     8  360    175  3.15  3.44  17.0     0     0     3     2     5    37
 6  18.1     6  225    105  2.76  3.46  20.2     1     0     3     1     6    38
 7  14.3     8  360    245  3.21  3.57  15.8     0     0     3     4     7    39
 8  24.4     4  147.    62  3.69  3.19  20       1     0     4     2     8    40
 9  22.8     4  141.    95  3.92  3.15  22.9     1     0     4     2     9    41
10  19.2     6  168.   123  3.92  3.44  18.3     1     0     4     4    10    42
# … with 22 more rows

CodePudding user response:

There are multiple options - update the original data by assignment

mtcars[c("new", "new3")] <- apply(X = array(data = 1:64, dim = c(32, 2)),                                         MARGIN = c(1,2),                                         FUN = function(x) {return(x)})

Or another option is to cbind with dimnames found in array

cbind(mtcars, apply(X = array(data = 1:64, dim = c(32, 2), dimnames = list(NULL, c('new2', 'new3'))),                                         MARGIN = c(1,2),                                         FUN = function(x) {return(x)}))

Or could also do

do.call(cbind, list(mtcars, new=apply(X = array(data = 1:64, dim = c(32, 2)),
                    MARGIN = c(1,2),
                    FUN = function(x) {return(x)})))

or with

`[<-`(mtcars, c('new2', 'new3'), value = apply(X = array(data = 1:64, dim = c(32, 2)),
                                        MARGIN = c(1,2),
                                        FUN = function(x) {return(x)}))
  • Related