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

如何用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.25 02:22:55