如何在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:编写统计逻辑
我们需要同时满足两个条件:
- Num.数值从1变为2(当前行Num.是2,前一行Num.是1)
- 前一行的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




