在dplyr中如何将清洗后的行重新嵌套为向量列?
解决嵌套后得到向量列的问题
示例数据集
先构造一个和你场景匹配的示例数据:
library(tidyverse) df <- tibble( id = 1:2, movies = c(" The Shawshank Redemption , Forrest Gump , Inception ", "The Dark Knight , Pulp Fiction, Fight Club ") )
问题根源
你用nest()得到tibble列是因为该函数默认会把分组后的内容封装成tibble,而你需要的是向量组成的列表列,可以通过以下几种方式实现:
方法1:直接批量清洗向量(最高效,无需拆展再嵌套)
跳过unnest步骤,直接用map对拆分后的向量元素批量清洗,一步得到向量列:
df_clean <- df %>% mutate( # 拆分逗号分隔的内容为向量 movies_split = str_split(movies, ","), # 对每个向量里的元素依次做去首尾空格、压缩中间空格 movies_clean = map(movies_split, ~ str_squish(str_trim(.x))) ) %>% select(id, movies, movies_clean)
此时movies_clean就是你需要的向量列,每个元素是清洗后的电影名向量。
方法2:从已展开的数据集重新生成向量列
如果已经完成了拆展和清洗步骤,用group_by + summarise替代nest(),直接将分组后的内容打包成向量:
# 先执行你原来的拆展、清洗步骤 df_unnested <- df %>% mutate(movies_split = str_split(movies, ",")) %>% unnest(movies_split) %>% mutate(movies_clean = str_squish(str_trim(movies_split))) # 重新分组并生成向量列 df_nested_vector <- df_unnested %>% group_by(id) %>% summarise(movies_vector = list(movies_clean), .groups = "drop")
这里movies_vector就是向量列,list(movies_clean)会把每组的清洗后名称直接打包成向量存入列表。
方法3:将nest生成的tibble列转换为向量列
如果已经用nest()得到了tibble列,可以用map提取其中的向量:
# 你原来的嵌套操作 df_nested_tibble <- df_unnested %>% nest(movies_nested = movies_clean) # 转换为向量列 df_vector_col <- df_nested_tibble %>% mutate(movies_vector = map(movies_nested, ~ pull(.x, movies_clean))) %>% select(-movies_nested)
验证结果
可以用class()查看列类型:
class(df_vector_col$movies_vector[[1]]) # 输出:"character"(即向量类型)
内容的提问来源于stack exchange,提问作者Ahmad Noman Alnoor
相关产品推荐
相关产品推荐

