开发用于标识向量中重复字符串出现层级的变量需求
我来帮你搞定这个文本分类的需求!咱们可以用两种方式实现——一种是用dplyr包(代码更直观易读),另一种是Base R(不用额外加载包),都能完美匹配你要的标记规则。
方法一:用dplyr实现(推荐)
首先加载dplyr包,如果还没安装的话先跑install.packages("dplyr")完成安装:
library(dplyr)
接下来处理数据,核心逻辑是按name分组,再在每个分组内统计text的累计出现次数,最后根据次数匹配标记:
# 先构造你的示例数据集 name = c("T","T","T","T","T","T","T","T","T","T") text = c("a","b","a","a","b","c","a","a","b","a") dfA = data.frame(name, text) # 分组计算并生成标记列 dfA <- dfA %>% group_by(name, text) %>% # 按name+text分组,确保每个name下的text单独计数 mutate( occurrence = row_number(), # 生成每个text的累计出现次数(第1次、第2次...) dup = case_when( occurrence == 1 ~ "origin", # 第1次出现标记为origin occurrence %in% 2:3 ~ "FirstThree", # 第2-3次标记为FirstThree occurrence >= 4 ~ "MoreThanThree" # 第4次及以后标记为MoreThanThree ) ) %>% ungroup() # 取消分组,回到普通数据框格式
运行完这段代码后,你可以打印dfA查看结果,和你提供的示例完全一致:
print(dfA)
输出结果:
# A tibble: 10 × 4 name text occurrence dup <chr> <chr> <int> <chr> 1 T a 1 origin 2 T b 1 origin 3 T a 2 FirstThree 4 T a 3 FirstThree 5 T b 2 FirstThree 6 T c 1 origin 7 T a 4 MoreThanThree 8 T a 5 MoreThanThree 9 T b 3 FirstThree 10 T a 6 MoreThanThree
方法二:Base R实现(无需额外包)
如果不想加载dplyr,用Base R的ave()函数也能实现相同效果:
# 构造示例数据 name = c("T","T","T","T","T","T","T","T","T","T") text = c("a","b","a","a","b","c","a","a","b","a") dfA = data.frame(name, text) # 计算累计出现次数 dfA$occurrence <- with(dfA, ave(rep(1, nrow(dfA)), name, text, FUN = seq_along)) # 根据次数生成标记 dfA$dup <- with(dfA, ifelse(occurrence == 1, "origin", ifelse(occurrence %in% 2:3, "FirstThree", "MoreThanThree")))
这段代码的逻辑和dplyr版本完全一致,只是用Base R的函数实现,结果也和示例匹配。
关键逻辑说明
不管用哪种方法,核心都是:
- 必须按
name和text组合分组,这样才能保证每个name下的text出现次数是独立统计的,不会跨name混淆。 - 累计出现次数是判断标记的核心依据,第1次、2-3次、4次及以后分别对应你要的三个类别。
内容的提问来源于stack exchange,提问作者Fred Poole
相关产品推荐
相关产品推荐

