如何用R高效压缩向量:将重复元素转为元素+计数形式
嘿,这两个R语言的向量处理任务我熟得很,给你整理了实用的解决方法,不管是统计重复实例还是压缩连续重复元素都能轻松搞定:
任务1:统计向量中所有重复出现的实例
这里的统计是指所有出现次数的汇总,不是连续重复的计数,有两种常用方法:
- 基础R快速实现:用内置的
table()函数,一行代码就能得到每个元素的总出现次数:
运行后会输出类似这样的结果,清晰展示每个元素的总出现次数:# 示例向量 v <- c("a","a","a","b","a","b","b","c","b") # 统计所有元素的重复次数 table(v)v a b c 4 4 1 - 数据框格式输出(更易后续处理):如果需要结构化的结果,用
dplyr包的count()函数,还能按计数排序:
输出是带列名的数据框,方便进一步分析:library(dplyr) # 转为 tibble 后统计 tibble(v) %>% count(v, sort = TRUE)v n 1 a 4 2 b 4 3 c 1
任务2:将连续重复的向量压缩为带计数的格式
这个需求是把连续重复的元素合并成「元素+重复次数」的格式,最高效的方法是用基础R的rle()函数(游程编码),专门处理这类连续重复的场景:
# 用长字符串示例测试 v <- c("alfonso","alfonso","alfonso","berta","alfonso","berta","berta","cesar","berta") # 用rle处理连续重复元素 rle_result <- rle(v) # 拼接元素和对应的连续重复次数 res <- paste0(rle_result$values, rle_result$lengths) # 查看结果 res
运行后就能得到你想要的压缩向量:
[1] "alfonso3" "berta1" "alfonso1" "berta2" "cesar1" "berta1"
原理很简单:rle()会返回一个列表,其中values是每个连续重复段的元素,lengths是对应段的重复次数,用paste0()直接拼接就能得到目标格式,而且内置函数效率极高,处理大向量也毫无压力。
如果你习惯用tidyverse的语法,也可以这样实现:
library(dplyr) library(tidyr) tibble(v = v) %>% # 给连续相同的元素分配分组ID mutate(group = cumsum(v != lag(v, default = first(v)))) %>% # 按分组和元素统计次数 group_by(group, v) %>% summarise(count = n(), .groups = "drop") %>% # 拼接成压缩格式 mutate(compressed = paste0(v, count)) %>% # 提取结果向量 pull(compressed)
这个方法逻辑更直观,适合熟悉tidyverse工作流的用户。
内容的提问来源于stack exchange,提问作者user3072843
相关产品推荐
相关产品推荐

