How to flatten R data frame that contains lists?

后端 未结 3 2024
梦谈多话
梦谈多话 2020-12-17 15:08

I want to find the best \"R way\" to flatten a dataframe that looks like this:

  CAT    COUNT     TREAT
   A     1,2,3     Treat-a, Treat-b
   B     4,5              


        
3条回答
  •  孤街浪徒
    2020-12-17 15:47

    Here is a solution using base R, accepting vectors of any length inside your list and no need to specify which columns of the dataframe you want to collapse. Part of the solution was generated using this answer.

    df2 <- do.call(cbind,lapply(df,function(x){
      #check if it is a list, otherwise just return as is
      if(is.list(x)){
        return(data.frame(t(sapply(x,'[',seq(max(sapply(x,length)))))))
      } else{
      return(x)
      }
    }))
    

    As of R 3.2 there is lengths to replace sapply(x, length) as well,

    df3 <- do.call(cbind.data.frame, lapply(df, function(x) {
      # check if it is a list, otherwise just return as is
      if (is.list(x)) {
        data.frame(t(sapply(x,'[', seq(max(lengths(x))))))
      } else {
       x
     }
    }))
    

    data used:

    df <- structure(list(CAT = structure(1:2, .Label = c("A", "B"), class = "factor"), 
        COUNT = list(1:3, 4:5), TREAT = list(c("Treat-a", "Treat-b"
        ), c("Treat-c", "Treat-d", "Treat-e"))), .Names = c("CAT", 
    "COUNT", "TREAT"), row.names = c(NA, -2L), class = "data.frame")
    

提交回复
热议问题