如何在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
相关产品推荐
相关产品推荐

