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)
