In a nested data frame, one or more of the columns consist of another data frame. These structures frequently appear when parsing JSON data from the web. We can flatten such data frames into a regular 2 dimensional tabular structure.

flatten(x, recursive = TRUE)

Arguments

x

a data frame

recursive

flatten recursively

Examples

options(stringsAsFactors=FALSE) x <- data.frame(driver = c("Bowser", "Peach"), occupation = c("Koopa", "Princess")) x$vehicle <- data.frame(model = c("Piranha Prowler", "Royal Racer")) x$vehicle$stats <- data.frame(speed = c(55, 34), weight = c(67, 24), drift = c(35, 32)) str(x)
#> 'data.frame': 2 obs. of 3 variables: #> $ driver : chr "Bowser" "Peach" #> $ occupation: chr "Koopa" "Princess" #> $ vehicle :'data.frame': 2 obs. of 2 variables: #> ..$ model: chr "Piranha Prowler" "Royal Racer" #> ..$ stats:'data.frame': 2 obs. of 3 variables: #> .. ..$ speed : num 55 34 #> .. ..$ weight: num 67 24 #> .. ..$ drift : num 35 32
str(flatten(x))
#> 'data.frame': 2 obs. of 6 variables: #> $ driver : chr "Bowser" "Peach" #> $ occupation : chr "Koopa" "Princess" #> $ vehicle.model : chr "Piranha Prowler" "Royal Racer" #> $ vehicle.stats.speed : num 55 34 #> $ vehicle.stats.weight: num 67 24 #> $ vehicle.stats.drift : num 35 32
str(flatten(x, recursive = FALSE))
#> 'data.frame': 2 obs. of 4 variables: #> $ driver : chr "Bowser" "Peach" #> $ occupation : chr "Koopa" "Princess" #> $ vehicle.model: chr "Piranha Prowler" "Royal Racer" #> $ vehicle.stats:'data.frame': 2 obs. of 3 variables: #> ..$ speed : num 55 34 #> ..$ weight: num 67 24 #> ..$ drift : num 35 32
if (FALSE) { data1 <- fromJSON("https://api.github.com/users/hadley/repos") colnames(data1) colnames(data1$owner) colnames(flatten(data1)) # or for short: data2 <- fromJSON("https://api.github.com/users/hadley/repos", flatten = TRUE) colnames(data2) }