首页 > 解决方案 > 取消嵌套列表在R中的数据框列中表示为字符串

问题描述

我正在使用一个非常大的数据集,该数据集具有一个列,其中包含适用于每个观察的可变长度术语列表。不幸的是,该列是字符类型,并将列表表示为一个字符串,并带有括号,以及各个术语之间的引号和逗号。在下面的代码块中,我展示了类似的示例数据帧。我想做的基本上是从raw_dfdesired_df

library(tidyverse)


raw_df <- data.frame("movie_id" = c(1, 2, 3, 4),
                        "categories" = c("[\"Romance\", \"Comedy\", \"Holiday\"]", 
                                         "[\"Romance\", \"Comedy\"]", 
                                         "[\"Horror\"]",
                                         "[\"Action\", \"Thriller\"]") ) 

desired_df <- data.frame("movie_id" = c(1, 1, 1, 2, 2, 3, 4, 4),
                         "categories" = c("Romance", "Comedy", "Holiday",
                                          "Romance", "Comedy", "Horror", 
                                          "Action", "Thriller")) 

我正在尝试但未能做的是提出一个优雅的矢量化解决方案,将字符串转换为列表,然后从列表中提取每个术语(我认为最好是长数据框格式)以进行进一步分析。

我编写了一些非向量化函数来在 for 循环的上下文中执行此操作,但数据集足够大,以至于运行时间过长。例如:

unzip_terms <- function(t, x){
    y <- as.list(gsub("]", "", gsub("[", "", gsub("'", "", strsplit(x, ","), fixed=TRUE), fixed=TRUE), fixed = TRUE))
    df <- data.frame(id = t, term = y) %>%
        group_by(id, term) %>%
        summarize(count = n(), .groups = "drop")
    return(df)
}


compile_term_df <- function(df){
    for(i in 1:nrow(df)){
        working_df <- unzip_terms(df$id[i], df$term[i])
        if(i == 1){
            final_df <- working_df 
        } else {
            final_df <- final_df %>% bind_rows(working_df)
        }
    }
    return(final_df)
}

我还尝试了、 和的不同组合strsplit,但使用这些的逻辑还没有对我有用。感谢任何人可以提供的任何方向。lapplyunnest

标签: rtidyverse

解决方案


我们可以separate_rows在去掉方括号和引号后使用

library(dplyr)
library(tidyr)
library(stringr)
raw_df %>% 
  mutate(categories = str_remove_all(categories, '\\[|\\]|"')) %>% 
  separate_rows(categories)

-输出

# A tibble: 8 x 2
#  movie_id categories
#     <dbl> <chr>     
#1        1 Romance   
#2        1 Comedy    
#3        1 Holiday   
#4        2 Romance   
#5        2 Comedy    
#6        3 Horror    
#7        4 Action    
#8        4 Thriller  

推荐阅读