I have this nested data
I want to unnest it, but I have to standardize the classes of the columns before to unnest
`library(tidyverse`)
nested_data<-iris %>% nest(data = !Species)
#I added to the third dataset an additionnal variable
nested_data$data[[3]]$randomVar<-round(rnorm(nrow(
nested_data$data[[3]]),100,5),1)
#I dropped a column of the second dataset
nested_data$data[[2]]$Sepal.Length<-NULL
#I changed the type of certain variables
nested_data$data[[2]]$Petal.Length<- as.character(
nested_data$data[[2]]$Petal.Length)
nested_data$data[[1]]$Petal.Width<-as.character(
nested_data$data[[1]]$Petal.Width
)
With different type of classes for certain variables I can not unnest
nested_data%>%unnest(data)
I have this error message:
Error: Can't combine `..1$Petal.Length` <double> and `..2$Petal.Length` <character>.
Run `rlang::last_error()` to see where the error occurred.
I want to change in character
all the variables of each of the three datasets in one line of codes using a for loop
or any vectorization
method.
I have no idea how to do it.
CodePudding user response:
If the column types are different accidentally, then can use type.convert
before the unnest
library(dplyr)
library(tidyr)
library(purrr)
nested_data %>%
mutate(data = type.convert(data, as.is = TRUE)) %>%
unnest(data)
-output
# A tibble: 150 × 6
Species Sepal.Length Sepal.Width Petal.Length Petal.Width randomVar
<fct> <dbl> <dbl> <dbl> <dbl> <dbl>
1 setosa 5.1 3.5 1.4 0.2 NA
2 setosa 4.9 3 1.4 0.2 NA
3 setosa 4.7 3.2 1.3 0.2 NA
4 setosa 4.6 3.1 1.5 0.2 NA
5 setosa 5 3.6 1.4 0.2 NA
6 setosa 5.4 3.9 1.7 0.4 NA
7 setosa 4.6 3.4 1.4 0.3 NA
8 setosa 5 3.4 1.5 0.2 NA
9 setosa 4.4 2.9 1.4 0.2 NA
10 setosa 4.9 3.1 1.5 0.1 NA
# … with 140 more rows
Or if type.convert
wouldn't work (because of character elements, then force the columns to be of type character
, unnest
and then change the column types with type.convert
nested_data %>%
mutate(data = map(data,~
.x %>%
mutate(across(everything(), as.character)))) %>%
unnest(data) %>%
type.convert(as.is = TRUE)