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

R语言中为分组数据应用Rle函数的实现需求

按分组统计连续值的Rle解决方案

我明白你想要按城市分组,统计每个城市内连续count值的出现次数对吧?直接用Rle()函数确实会忽略分组逻辑,因为它默认是对整个向量处理的。这里给你两种可行的实现方案,都能得到你期望的输出:

方法一:使用dplyr(tidyverse风格)

首先我们先构造你的示例数据集:

# 构造原始数据框
df <- data.frame(
  City = c("Mexico", "Mexico", "London", "London", "London"),
  count = c(1, 1, 0, 1, 1)
)

接下来通过分组+Rle的组合实现需求:

library(dplyr)
library(tidyr)

# 按City分组,对每个组的count列应用Rle,再拆分结果并拼接成目标格式
result <- df %>%
  group_by(City) %>%
  # 把每个组的Rle结果存为列表
  summarize(rle_data = list(Rle(count))) %>%
  # 拆分Rle列表为values(对应count值)和lengths(连续出现次数)两列
  unnest_wider(rle_data) %>%
  # 拼接成你需要的字符串格式
  mutate(output = paste0(City, ", ", values, ":", lengths)) %>%
  # 提取最终结果
  pull(output)

# 查看输出
result

运行后会得到你想要的结果:

[1] "Mexico, 1:2" "London, 0:1" "London, 1:2"

方法二:使用data.table(高效处理大数据)

如果你的数据集比较大,data.table的处理速度会更有优势:

library(data.table)

# 转换为data.table格式
dt <- as.data.table(df)

# 按City分组生成Rle列表,再拆分列表提取values和lengths
result_dt <- dt[, .(rle_list = list(Rle(count))), by = City] %>%
  .[, .(City = rep(City, lengths(rle_list)),
        values = unlist(lapply(rle_list, function(x) x$values)),
        lengths = unlist(lapply(rle_list, function(x) x$lengths)))] %>%
  .[, output := paste0(City, ", ", values, ":", lengths)]

# 查看输出
result_dt$output

这个方法的输出和上面完全一致,适合处理百万级以上的数据集。

为什么你之前的方法没生效?

你直接用Rle()或者普通循环没成功,核心原因是没有先按City分组再处理。Rle()是对整个向量做连续值统计,必须先把数据按City拆分成多个子向量,再分别对每个子向量应用Rle(),最后把结果合并起来,才能得到分组后的连续值统计结果。

内容的提问来源于stack exchange,提问作者Jay

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.25 08:06:43