在R脚本中实现行字符串对比并生成连续计数列的技术问题
R脚本实现行字符串对比生成计数列
需求说明
对比数据框中当前行与前一行的字符串:
- 若字符串匹配,计数保持不变
- 若字符串不匹配,计数器加1
最终生成独立的计数列record_number
示例数据
# 构造示例数据框 knime.in <- data.frame( combined_string = c( "Error NIO belt full", "Error NIO belt full", "Error transport - x axis error [70MA1]", "Error loading - lifter hp [341BG4 + 341BG6] not reached", "Place LF - NIO Station6 graph windows 2 out of", "Error loading - scanner not ready", "Error loading - scanner not ready" ), stringsAsFactors = FALSE )
原代码问题分析
你提供的代码存在以下问题:
- 使用
lag()函数在循环中错误:lag()会生成整个移位后的向量,无法针对当前行i与前一行i-1做逐行判断 - 逻辑反转:需求是不匹配时计数器加1,但原代码是匹配时加1
- 未处理第一行的边界情况:第一行没有前一行,应直接初始化为1
正确实现方法
方法1:循环实现(适合新手理解)
knime.out <- knime.in n <- nrow(knime.out) knime.out$record_number <- integer(n) # 初始化第一行计数 r_num <- 1 knime.out$record_number[1] <- r_num # 从第二行开始逐行对比 for (i in 2:n) { if (knime.out$combined_string[i] != knime.out$combined_string[i-1]) { r_num <- r_num + 1 } knime.out$record_number[i] <- r_num }
方法2:向量化实现(高效推荐)
用dplyr的向量化操作替代循环,效率更高,代码更简洁:
library(dplyr) knime.out <- knime.in %>% mutate( # 生成标记:第一行标记为1,后续行与前一行不同则标记为1,否则为0 diff_flag = c(1, as.integer(combined_string[-1] != combined_string[-n()])), # 累加标记得到连续计数 record_number = cumsum(diff_flag) ) %>% select(-diff_flag) # 可选:移除中间辅助列
最终结果
运行后得到的knime.out如下:
combined_string record_number 1 Error NIO belt full 1 2 Error NIO belt full 1 3 Error transport - x axis error [70MA1] 2 4 Error loading - lifter hp [341BG4 + 341BG6] not reached 3 5 Place LF - NIO Station6 graph windows 2 out of 4 6 Error loading - scanner not ready 5 7 Error loading - scanner not ready 5
内容的提问来源于stack exchange,提问作者Enrique Pena
相关产品推荐
相关产品推荐

