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

如何在R语言中创建连续令牌(类n-gram)衍生列?

在R中实现目标新增列的方法

嘿,我来帮你搞定这个需求!先理清楚你的要求:根据原始数据里的不同行,生成对应的新增列,具体规则是:

  • 当行内容是"A"时,新增列填"A`"
  • 当行内容是"B"时,新增列留空,且不生成额外行
  • 像"URBAN 1"、"PLAN 2"这类带数字的行,要提取前面的英文单词,生成所有连续3个字符的滑动窗口子串,每个子串对应一行,原行内容重复展示

接下来用R的常用工具包dplyr和stringr来实现,步骤如下:

1. 准备原始数据

先把你的数据转换成R的数据框格式:

# 先安装需要的包(如果没装过的话)
# install.packages(c("dplyr", "stringr"))

library(dplyr)
library(stringr)

# 原始数据集
raw_data <- data.frame(original = c("A", "B", "URBAN 1", "PLAN 2"), stringsAsFactors = FALSE)

2. 写一个生成滑动子串的函数

我们需要一个小函数,输入英文单词,返回所有连续3个字符的滑动子串:

get_sliding_substrings <- function(word) {
  # 单词长度不够3的话,返回空值
  if (nchar(word) < 3) return(NA_character_)
  # 计算可以生成的子串数量
  sub_count <- nchar(word) - 2
  # 循环生成每个子串
  sapply(1:sub_count, function(i) substring(word, i, i + 2))
}

3. 逐行处理并展开结果

用rowwise()逐行处理数据,再用unnest()把多值的结果拆成多行:

final_result <- raw_data %>%
  rowwise() %>%
  mutate(
    new_col = case_when(
      original == "A" ~ list("A`"),  # 用list包装,方便后续拆分行
      original == "B" ~ list(NA_character_),
      # 提取前面的英文单词,生成子串
      TRUE ~ list(get_sliding_substrings(str_extract(original, "^\\w+")))
    )
  ) %>%
  unnest(new_col, keep_empty = TRUE)  # 保留B那行的空值

# 把NA换成空字符串,和你要的效果一致
final_result <- final_result %>% mutate(new_col = ifelse(is.na(new_col), "", new_col))

看看最终输出

运行完代码后,final_result就是你想要的样子:

original new_col
1        A     A`
2        B       
3   URBAN 1     URB
4   URBAN 1     RBA
5   URBAN 1     BAN
6    PLAN 2     PLA
7    PLAN 2     LAN

额外说明

  • 如果你的数据里还有其他类似的带数字的条目,这个代码也能自动处理,只要前面的英文单词长度≥3,就会生成对应的滑动子串
  • 要是你不想用dplyr,也可以用基础R的循环来实现,但dplyr的写法更简洁易读

内容的提问来源于stack exchange,提问作者SATH

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 04:50:13