如何识别数据框行中重复条目并生成逻辑列与重复值列?
解决R数据框的重复值判断与提取需求
嘿,这就帮你搞定这个R数据框的处理需求!先看一下你的原始数据:
col_1 <- c("A", "A", "B", "B", "C", "C") col_2 <- c("A", "B", "C", "D", "E", "F") col_3 <- c("A", "B", "C", "C", "B", "A") df <- data.frame(col_1, col_2, col_3)
接下来分两步实现你要的两个新列:
1. 生成判断是否存在重复≥2次的t_f列
我们可以用apply()对每行进行元素频率统计,判断是否有元素出现次数≥2:
# 添加t_f列 df$t_f <- apply(df, 1, function(x) { # 统计每行元素出现次数,检查是否有≥2次的 any(table(x) >= 2) })
运行后t_f列的结果和你给出的示例完全一致:c(TRUE, TRUE, TRUE, FALSE, FALSE, FALSE)。
2. 生成提取重复值的name列
同样用apply()处理每行,提取出现次数≥2的元素,没有则返回NA:
# 添加name列 df$name <- apply(df, 1, function(x) { tbl <- table(x) # 筛选出出现次数≥2的元素名称 repeat_val <- names(tbl)[tbl >= 2] # 如果没有重复值就返回NA,否则返回重复值 if (length(repeat_val) == 0) NA else repeat_val })
得到的name列就是你要的:c("A", "B", "C", NA, NA, NA)。
用tidyverse/dplyr实现(可选)
如果你习惯用dplyr的管道风格,也可以这样写:
library(dplyr) df_processed <- df %>% rowwise() %>% mutate( t_f = any(table(c(col_1, col_2, col_3)) >= 2), name = { tbl <- table(c(col_1, col_2, col_3)) repeat_val <- names(tbl)[tbl >= 2] if (length(repeat_val) == 0) NA else repeat_val } ) %>% ungroup()
这样处理后的df_processed同样包含你需要的两个新列。
内容的提问来源于stack exchange,提问作者John L. Godlee
相关产品推荐
相关产品推荐

