如何在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
相关产品推荐
相关产品推荐

