r - 取消嵌套列表在R中的数据框列中表示为字符串
问题描述
我正在使用一个非常大的数据集,该数据集具有一个列,其中包含适用于每个观察的可变长度术语列表。不幸的是,该列是字符类型,并将列表表示为一个字符串,并带有括号,以及各个术语之间的引号和逗号。在下面的代码块中,我展示了类似的示例数据帧。我想做的基本上是从raw_df
到desired_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
,但使用这些的逻辑还没有对我有用。感谢任何人可以提供的任何方向。lapply
unnest
解决方案
我们可以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
推荐阅读
- sql - 选择两个不同行之间的日期差异
- react-native - 当使用 redux 在 react-native 上更改状态时,connect 不会刷新
- java - 即使条件为真,为什么我的方法返回 false?
- javascript - 如何删除网页中的特定类?
- python - 如何检查多对多相关字段是否包含所有给定值
- css - 动态加载外部css资源模型端
- r - 数据有 101 个值 为什么结果有 303 个值?
- sapui5 - Sapui5 路由器在 Master Detail App 中第二次无法正常工作
- javascript - React/Material 使用 withStyles 将元素悬停在其上时隐藏它的子元素
- javascript - 如何删除 _id 属性?