如何从聚合后的df2还原df1?多列拆分及保留大写方案
从聚合后的df2还原原始df1的优雅方案
你遇到的问题核心是要把按brand聚合后用分隔符拼接的多列拆分成原始行结构,还要保留变量的原始大小写,tidytext::unnest_tokens因为默认的文本处理特性(比如转小写)和多列处理的不便,确实不是最优选择。下面给你两个简洁优雅的解决方案:
方案一:用tidyr的separate_rows(推荐,代码最简洁)
tidyr::separate_rows专门用于将包含分隔符的列拆分成多行,而且能同时处理多个列,完美保留原始大小写,还能保证拆分后的列一一对应(不会错位)。
代码示例:
library(dplyr) library(tidyr) # 从df2还原df1 df1_restore <- df2 %>% # 同时拆分models、countries、years三列,指定分隔符为" /// " separate_rows(models, countries, years, sep = " /// ") %>% # 重命名列名回原始名称 rename(model = models, country = countries, year = years) %>% # 将year转换为数值型(和原始df1的类型一致) mutate(year = as.numeric(year)) # 验证还原结果是否和原始df1一致 all.equal(df1_restore, df1, check.attributes = FALSE) # 返回TRUE说明还原正确
为什么这个方法好:
- 一步完成多列拆分,代码简洁易读
- 完全保留原始文本的大小写(不会像
unnest_tokens默认转小写) - 自动保证同一
brand下的model、country、year一一对应,不会出现错位
方案二:用data.table原生方法(和你之前的聚合逻辑匹配)
如果你习惯用data.table,可以用tstrsplit结合分组拆分,同样高效且保留原始格式:
代码示例:
library(data.table) setDT(df2) df1_restore_dt <- df2[, .( model = tstrsplit(models, " /// ")[[1]], country = tstrsplit(countries, " /// ")[[1]], year = as.numeric(tstrsplit(years, " /// ")[[1]]) ), by = brand] # 若需要转换回data.frame格式 df1_restore_dt <- as.data.frame(df1_restore_dt)
补充:为什么tidytext::unnest_tokens不适用
unnest_tokens的设计初衷是文本挖掘中的分词处理,默认会对文本进行小写转换(虽可以通过to_lower = FALSE关闭),但它一次只能处理一列,多次调用容易破坏多列之间的对应关系,代码也会更繁琐。比如你之前尝试的代码只处理了models列,要处理另外两列还得嵌套调用,远不如separate_rows直接高效。
内容的提问来源于stack exchange,提问作者DaniCee
相关产品推荐
相关产品推荐

