Dataframe within dataframe?

后端 未结 3 1461
孤街浪徒
孤街浪徒 2021-01-04 02:38

Consider this example:

df <- data.frame(id=1:10,var1=LETTERS[1:10],var2=LETTERS[6:15])

fun.split <- function(x) tolower(as.character(x))
df$new.letter         


        
3条回答
  •  长发绾君心
    2021-01-04 03:05

    @akrun solved 90% of my problem. But I had data.frames buried within data.frames, buried within data.frames and so on, without knowing the depth to which this was happening.

    In this case, I thought sharing my recursive solution might be helpful to others searching this thread as I was:

        unnest_dataframes <- function(x) {
    
            y <- do.call(data.frame, x)
    
            if("data.frame" %in% sapply(y, class)) unnest_dataframes(y)
    
            y
    
        }
    
        new_data <- unnest_dataframes(df)
    

    Although this itself sometimes has problems and it can be helpful to separate all columns of class "data.frame" from the original data set then cbind() it back together like so:

      # Find all columns that are data.frame
      # Assuming your data frame is stored in variable 'y'
      data.frame.cols <- unname(sapply(y, function(x) class(x) == "data.frame"))
      z <- y[, !data.frame.cols]
    
      # All columns of class "data.frame"
      dfs <- y[, data.frame.cols]
    
      # Recursively unnest each of these columns
      unnest_dataframes <- function(x) {
        y <- do.call(data.frame, x)
        if("data.frame" %in% sapply(y, class)) {
            unnest_dataframes(y)
        } else {
            cat('Nested data.frames successfully unpacked\n')
          }
        y
      }
    
      df2 <- unnest_dataframes(dfs)
    
      # Combine with original data
      all_columns <- cbind(z, df2)
    

提交回复
热议问题