Home > Software design >  Is there a way to add columns to dataframe that is in the form of function
Is there a way to add columns to dataframe that is in the form of function

Time:01-08

Is there a way to add columns to dataframe that is in the form of function

dfs <- function(){iris}
d <- nrow(dfs())
dfs()$new <- seq_len(d)
Error in dfs()$new <- seq_len(d) : invalid (NULL) left side of assignment

Expected output

head(dfs())
  Sepal.Length Sepal.Width Petal.Length Petal.Width Species new
1          5.1         3.5          1.4         0.2  setosa   1
2          4.9         3.0          1.4         0.2  setosa   2
3          4.7         3.2          1.3         0.2  setosa   3
4          4.6         3.1          1.5         0.2  setosa   4
5          5.0         3.6          1.4         0.2  setosa   5
6          5.4         3.9          1.7         0.4  setosa   6

CodePudding user response:

There is no object created in the global env. In that case, we can use transform

transform(dfs(), new = seq_len(d))

Or use

 `[<-`(dfs(), "new", value =  seq_len(d))

If we want to use $, create an object

tmp <- dfs()
tmp$new <- seq_len(d)

CodePudding user response:

We could use add_column function from tibble package:

library(tibble)               
mtcars %>% 
  add_column(my_new_column = 1:32,
             .after = "cyl")

CodePudding user response:

Thanks to @Adam for the suggestions. We can use 1:n() to have more cleaner code.

library(dplyr)

dfs <- function() {
  iris
}

dfs() %>%
  {
    mutate(., new = 1:nrow(.))
  } %>%
  head()
#>   Sepal.Length Sepal.Width Petal.Length Petal.Width Species new
#> 1          5.1         3.5          1.4         0.2  setosa   1
#> 2          4.9         3.0          1.4         0.2  setosa   2
#> 3          4.7         3.2          1.3         0.2  setosa   3
#> 4          4.6         3.1          1.5         0.2  setosa   4
#> 5          5.0         3.6          1.4         0.2  setosa   5
#> 6          5.4         3.9          1.7         0.4  setosa   6

dfs() %>%
  mutate(new = 1:n()) %>%
  head()
#>   Sepal.Length Sepal.Width Petal.Length Petal.Width Species new
#> 1          5.1         3.5          1.4         0.2  setosa   1
#> 2          4.9         3.0          1.4         0.2  setosa   2
#> 3          4.7         3.2          1.3         0.2  setosa   3
#> 4          4.6         3.1          1.5         0.2  setosa   4
#> 5          5.0         3.6          1.4         0.2  setosa   5
#> 6          5.4         3.9          1.7         0.4  setosa   6

dfs() %>%
  mutate(new = 1:nrow(cur_data())) %>%
  head()
#>   Sepal.Length Sepal.Width Petal.Length Petal.Width Species new
#> 1          5.1         3.5          1.4         0.2  setosa   1
#> 2          4.9         3.0          1.4         0.2  setosa   2
#> 3          4.7         3.2          1.3         0.2  setosa   3
#> 4          4.6         3.1          1.5         0.2  setosa   4
#> 5          5.0         3.6          1.4         0.2  setosa   5
#> 6          5.4         3.9          1.7         0.4  setosa   6

Created on 2022-01-07 by the reprex package (v2.0.1)

  •  Tags:  
  • Related