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
相关产品推荐
相关产品推荐

