如何统计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
简单解释下关键步骤:
color_block变量用来标记原始数据中连续相同Color的片段,这样我们不会把不连续的同Color行混在一起统计连续序列- 用
rle()函数(游程编码)来识别每个Color块内连续相同的Numbers值,提取其中值为1的序列长度 - 最后检查每种Color是否存在0,补充
Streaks=0的行,确保结果和你的预期匹配
内容的提问来源于stack exchange,提问作者toro
相关产品推荐
相关产品推荐

