在R语言中移除多列重复值组合的数据行
移除玩家组合重复行的解决方案
这里有两种实用的方法来处理你的需求——去除数据框中Player_1至Player_7列里玩家组合重复的行(即使玩家在列中的顺序不同),每组仅保留任意一行即可:
方法1:使用dplyr包(简洁直观)
dplyr的管道式操作能让代码逻辑更清晰易读,步骤如下:
首先加载你提供的数据集:
df <- structure(list(X = c(29L, 32L, 34L, 44L, 47L, 49L), Player_1 = c("Mike Reilly", "Mike Reilly", "Mike Reilly", "Mike Reilly", "Mike Reilly", "Mike Reilly"), Player_2 = c("Andrew Harris", "Andrew Harris", "Andrew Harris", "Andrew Harris", "Andrew Harris", "Andrew Harris"), Player_3 = c("RB 1", "RB 1", "RB 1", "RB 2", "RB 2", "RB 2"), Player_4 = c("Dominque Rhymes", "Dominque Rhymes", "Duron Carter", "Dominque Rhymes", "Dominque Rhymes", "Duron Carter"), Player_5 = c("Duron Carter", "Shaquille Johnson", "Shaquille Johnson", "Duron Carter", "Shaquille Johnson", "Shaquille Johnson"), Player_6 = c("BC D", "BC D", "BC D", "BC D", "BC D", "BC D"), Player_7 = c("Shaquille Johnson", "Duron Carter", "Dominque Rhymes", "Shaquille Johnson", "Duron Carter", "Dominque Rhymes"), total_sal = c(39084L, 39084L, 39084L, 39084L, 39084L, 39084L)), row.names = c(NA, 6L), class = "data.frame")
然后执行去重操作:
library(dplyr) df_unique <- df %>% rowwise() %>% # 对当前行的Player_1到Player_7排序,拼接成唯一标识字符串 mutate(player_key = paste(sort(c(Player_1, Player_2, Player_3, Player_4, Player_5, Player_6, Player_7)), collapse = "|")) %>% ungroup() %>% # 根据唯一标识去重,保留每组第一行并保留所有原始列 distinct(player_key, .keep_all = TRUE) %>% # 移除临时生成的标识列 select(-player_key)
方法2:使用Base R(无需额外包)
如果你不想加载第三方包,base R也能轻松实现需求:
# 为每行生成排序后的玩家组合字符串作为唯一键 player_keys <- apply(df[, paste0("Player_", 1:7)], 1, function(row) paste(sort(row), collapse = "|")) # 获取未重复的行索引 unique_rows <- !duplicated(player_keys) # 提取去重后的数据集 df_unique_base <- df[unique_rows, ]
核心思路说明
两种方法的本质逻辑一致:将每行的玩家列元素排序后生成唯一标识——不管玩家在列中的顺序如何,同一个组合排序后的结果完全一致,以此作为分组依据去重,最终每组保留一行数据。
内容的提问来源于stack exchange,提问作者Yandle
相关产品推荐
相关产品推荐

