You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何从聚合后的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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 07:21:28