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

如何在R语言中统计两列间交换字符的重复情况并生成标记列

R语言实现无向字符对的重复标记

原始数据

df <- data.frame(col1 = c("A", "A", "A", "A", "A", "B", "B", "B", "B", "B", 
                      "C", "C", "C", "C", "C"), 
             col2 = c("A", "B", "C", "D", "E", "A", "B", "C", "D", "E", 
                      "A", "B", "C", "D", "E"))

需求说明

需要给数据框新增col3列,标记规则如下:

  • 当col1和col2为相同字符时,标记为1
  • 当col1和col2为不同字符时,若该字符对的反向组合(比如(B,A)对应(A,B))已在之前的行中出现过,标记为1,否则标记为0

最终目标数据框:

df <- data.frame(col1 = c("A", "A", "A", "A", "A", "B", "B", "B", "B", "B", 
                      "C", "C", "C", "C", "C"), 
             col2 = c("A", "B", "C", "D", "E", "A", "B", "C", "D", "E", 
                      "A", "B", "C", "D", "E"),
             col3 = c("1","0","0","0","0","1","1","0","0","0","1","1","1","0","0"))

解决方案

方法1:基础R代码

无需额外依赖包,用循环和向量操作实现:

# 生成统一的排序字符对(把无向对转为相同字符串)
df$sorted_pair <- apply(df[, c("col1", "col2")], 1, function(x) paste(sort(x), collapse = "_"))

# 初始化col3为"0"
df$col3 <- "0"

# 相同字符的行直接标记为"1"
df$col3[df$col1 == df$col2] <- "1"

# 遍历每行,检查不同字符的对是否在之前出现过
for (i in seq_len(nrow(df))) {
  if (df$col1[i] != df$col2[i]) {
    if (df$sorted_pair[i] %in% df$sorted_pair[1:(i-1)]) {
      df$col3[i] <- "1"
    }
  }
}

# 删除临时辅助列
df <- df[, names(df) != "sorted_pair"]

# 查看结果
print(df)

方法2:dplyr简洁实现

使用tidyverse系列的dplyr包,代码更简洁直观:

library(dplyr)

df <- df %>%
  # 生成排序后的无向对字符串
  mutate(sorted_pair = pmap_chr(list(col1, col2), ~paste(sort(c(..1, ..2)), collapse = "_"))) %>%
  # 先标记相同字符的行
  mutate(col3 = if_else(col1 == col2, "1", "0")) %>%
  # 对不同字符的行,检查是否为重复无向对
  mutate(col3 = if_else(col1 != col2 & sorted_pair %in% sorted_pair[1:(row_number()-1)], "1", col3)) %>%
  # 移除辅助列
  select(-sorted_pair)

# 查看结果
print(df)

两种方法运行后都能得到符合要求的结果。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.19 21:50:11