如何从R数据框文本列的每个单元格中随机提取20%词汇?
解决从文本列随机抽取20%词汇的问题
嘿,我明白你遇到的问题了——直接用sample()肯定不行,因为它默认是对整个向量抽样,而不是逐个单元格里的词汇单独处理。下面给你两种靠谱的实现方法,完全匹配你的需求:
方法1:基础R实现(无需额外包)
这种方法用lapply()遍历每个文本单元格,一步步完成拆分、抽样、合并的操作:
# 你的原始数据 text <- c("five1 five2 five3 five4 five5", "ten1 ten2 ten3 ten4 ten5 ten6 ten7 ten8 ten9 ten10", "fifteen1 fifteen2 fifteen3 fifteen4 fifteen5 fifteen6 fifteen7 fifteen8 fifteen9 fifteen10 fifteen11 fifteen12 fifteen13 fifteen14 fifteen15") id <- c(1, 2, 3) df <- data.frame(text, id) # 定义抽样函数 sample_20pct <- function(text_str) { # 拆分文本为单个词汇 words <- strsplit(text_str, " ")[[1]] # 计算要抽取的词汇数量(20%,四舍五入;需要向上取整可替换为ceiling()) n_sample <- round(length(words) * 0.2) # 避免n_sample为0的情况(比如仅1个词时,20%为0.2,round后为0,强制取1) n_sample <- max(n_sample, 1) # 随机抽样 sampled_words <- sample(words, n_sample) # 合并为字符串 paste(sampled_words, collapse = " ") } # 应用到text列,生成新列 df$text_20_random_percent <- sapply(df$text, sample_20pct)
方法2:dplyr + purrr 管道式实现(更简洁)
如果你习惯用tidyverse生态,这种写法更清爽:
library(dplyr) library(purrr) df <- df %>% mutate(text_20_random_percent = map_chr(text, function(x) { words <- strsplit(x, " ")[[1]] n_sample <- round(length(words)*0.2) %>% max(1) sample(words, n_sample) %>% paste(collapse = " ") }))
关键细节说明
- 为什么之前
sample()失败?大概率是你直接对df$text用sample(),这是抽取整个单元格,而非每个单元格内的词汇。必须先拆分每个文本为词汇列表,再逐个抽样。 - 抽样数量逻辑:示例中5个词抽1个、10个抽2个、15个抽3个,刚好是
round(length(words)*0.2)的结果。如果需要确保至少抽取1个词(比如文本只有3个词时,20%为0.6,round后为0),max(n_sample,1)会强制兜底。 - 随机性:每次运行结果会不同,因为
sample()是随机的,但抽样数量严格符合20%的要求。
运行后你会得到类似预期的结果,比如某次运行可能输出:
> df$text_20_random_percent [1] "five3" "ten5 ten9" "fifteen7 fifteen14 fifteen10"
内容的提问来源于stack exchange,提问作者Oscar Kjell
相关产品推荐
相关产品推荐

