You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

如何在R中统计S/T对应的Num.从1变为2的次数?

用R实现你的序列统计需求

嘿,手动统计这种序列变化确实挺费时间的,用R可以轻松自动化这个过程,我给你一步步拆解来做:

步骤1:把非结构化数据转成结构化格式

你给出的原始数据是一串空格分隔的字符串,我们先把它转换成R能方便处理的数据框,分成「S.T.R类型」和「Num.数值」两列:

# 输入你的原始数据
raw_data <- "S.T.R Num. S 1 R 2 T 1 S 2 S 3 S 1 T 1 S 2 S 1 R 2"

# 拆分字符串并去掉开头的表头,得到纯数据部分
data_parts <- strsplit(raw_data, " ")[[1]][-c(1, 2)]

# 转换成数据框:奇数位是S.T.R值,偶数位是Num.数值
seq_df <- data.frame(
  str_type = data_parts[seq(1, length(data_parts), 2)],
  num_val = as.integer(data_parts[seq(2, length(data_parts), 2)])
)

运行后得到的seq_df结构如下,方便后续处理:

str_type num_val
1         S       1
2         R       2
3         T       1
4         S       2
5         S       3
6         S       1
7         T       1
8         S       2
9         S       1
10        R       2

步骤2:编写统计逻辑

我们需要同时满足两个条件:

  1. Num.数值从1变为2(当前行Num.是2,前一行Num.是1)
  2. 前一行的S.T.R类型是S或T

用逻辑向量标记符合条件的位置,再求和就能得到次数:

# 标记所有"Num.从1变2"的位置(从第2行开始和前一行比较)
is_1_to_2 <- c(FALSE, seq_df$num_val[-1] == 2 & seq_df$num_val[-nrow(seq_df)] == 1)

# 标记前一行S.T.R是S/T的位置
prev_str_valid <- c(FALSE, seq_df$str_type[-nrow(seq_df)] %in% c("S", "T"))

# 统计同时满足两个条件的总次数
total_count <- sum(is_1_to_2 & prev_str_valid)

# 输出结果
cat("符合条件的次数:", total_count, "\n")

测试结果

用你的示例数据运行代码,会得到结果4,和手动统计的一致:

  • S(1)→R(2):符合
  • T(1)→S(2):符合
  • T(1)→S(2):符合
  • S(1)→R(2):符合

扩展说明

如果你的数据是存在文本文件里的,只需要把raw_data替换成读取文件的代码就行,比如用readLines()读取单行数据,或者用read.table()直接读取已结构化的文件。

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

火山引擎 最新活动