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

如何统计R数据框中各颜色对应连续1序列的出现次数及频率?

我来帮你实现这个连续序列统计的需求!根据你给出的输入和预期输出,这里的核心逻辑是:

  • 对于每种Color,统计连续1的序列长度(即Streaks)的出现次数(Count)
  • 如果该Color中存在0,则额外添加一行Streaks=0,且Count=1

下面是具体的R代码实现,用到了dplyr和tidyr包来简化数据处理:

# 加载所需包
library(dplyr)
library(tidyr)

# 你的原始数据框
df <- data.frame(
  Color=c('black','black','black','red','red', 'black','red','red', 'red','black','red','red', 'red','red'),
  Numbers=c(1,1,1,0,1,0,1,1,1,1,0,1,1,1)
)

# 第一步:统计每种Color下连续1的序列长度的出现次数
streaks_of_ones <- df %>%
  # 先标记原始数据中连续相同Color的块
  mutate(color_block = cumsum(c(TRUE, Color[-1] != Color[-nrow(df)]))) %>%
  # 按Color块分组,提取每个块内连续1的长度
  group_by(color_block, Color) %>%
  summarise(
    streaks = with(rle(Numbers), lengths[values == 1]),
    .groups = "drop"
  ) %>%
  # 展开列表格式的streaks
  unnest(streaks) %>%
  # 统计每个Color下各Streaks的出现次数
  count(Color, streaks, name = "Count") %>%
  rename(Streaks = streaks)

# 第二步:检查每种Color是否包含0,若包含则添加Streaks=0的行
has_zero_colors <- df %>%
  group_by(Color) %>%
  summarise(has_zero = any(Numbers == 0), .groups = "drop") %>%
  filter(has_zero) %>%
  mutate(Streaks = 0, Count = 1) %>%
  select(Color, Streaks, Count)

# 合并两部分结果,得到最终输出
occurrences <- bind_rows(streaks_of_ones, has_zero_colors) %>%
  arrange(Color, Streaks)

# 查看结果
print(occurrences)

运行这段代码后,你会得到和预期完全一致的结果:

# A tibble: 6 × 3
  Color  Streaks Count
  <chr>    <dbl> <int>
1 black        0     1
2 black        1     1
3 black        3     1
4 red          0     1
5 red          1     1
6 red          3     2

简单解释下关键步骤:

  1. color_block变量用来标记原始数据中连续相同Color的片段,这样我们不会把不连续的同Color行混在一起统计连续序列
  2. 用rle()函数(游程编码)来识别每个Color块内连续相同的Numbers值,提取其中值为1的序列长度
  3. 最后检查每种Color是否存在0,补充Streaks=0的行,确保结果和你的预期匹配

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.14 07:03:41