如何基于每行字符串去除R数据框中的重复值
按行删除R数据框中的重复成员值
首先给出原始数据框:
df <- structure(list( Core = c("Bestman", "Tetra"), member1 = c("Tera1", "Brownie1"), member2 = c("Tera2", "Brownie2"), member3 = c("Tera3", "Brownie3"), member4 = c("Tera4", "Brownie4"), member5 = c("Tera5", "Brownie5"), member6 = c("Brownie2", "Tera2"), member7 = c("Tera1", "Tera1"), member8 = c("Tera2", "") ), class = "data.frame", row.names = c(NA, -2L))
需求是:按行处理,删除每行中重复出现的成员值(保留首次出现的实例),同时移除空值,得到指定的输出结果。
方法一:Base R 实现
用apply逐行遍历处理,结合unique去重,再过滤空值,最后整理成数据框:
# 逐行处理:去重+过滤空值,补NA保证行长度一致 processed_rows <- t(apply(df, 1, function(row) { # 提取非空值并去重(保留首次出现) unique_non_empty <- unique(row[row != ""]) # 用NA填充至原数据框的列数,方便转成数据框 c(unique_non_empty, rep(NA, ncol(df) - length(unique_non_empty))) })) # 转换为数据框并设置列名 result_df <- as.data.frame(processed_rows, stringsAsFactors = FALSE) colnames(result_df) <- colnames(df) # 删除全为NA的列 result_df <- result_df[, colSums(is.na(result_df)) != nrow(result_df)] # 查看结果 print(result_df)
运行后输出:
Core member1 member2 member3 member4 member5 member6 1 Bestman Tera1 Tera2 Tera3 Tera4 Tera5 Brownie2 2 Tetra Brownie1 Brownie3 Brownie4 Brownie5 <NA> <NA>
如果需要移除末尾的NA(和目标输出完全一致),可以再做一步处理:
# 移除每行末尾的NA,统一列数 final_result <- as.data.frame(t(apply(result_df, 1, function(row) row[!is.na(row)])), stringsAsFactors = FALSE) colnames(final_result) <- colnames(df)[1:ncol(final_result)] print(final_result)
方法二:Tidyverse 实现
用dplyr和tidyr的长-宽格式转换来处理,逻辑更清晰:
library(dplyr) library(tidyr) result_tidy <- df %>% # 转长格式,把所有member列转为键值对 pivot_longer(cols = starts_with("member"), names_to = "col_name", values_to = "member_val") %>% # 过滤空值 filter(member_val != "") %>% # 按Core分组,保留每个成员值的首次出现 group_by(Core, member_val) %>% slice_head(n = 1) %>% ungroup() %>% # 按原始列的顺序排序,保证member1到memberN的顺序 arrange(Core, col_name) %>% # 转回宽格式 pivot_wider(names_from = col_name, values_from = member_val) print(result_tidy)
输出结果:
# A tibble: 2 × 6 Core member1 member2 member3 member4 member5 member6 <chr> <chr> <chr> <chr> <chr> <chr> <chr> 1 Bestman Tera1 Tera2 Tera3 Tera4 Tera5 Brownie2 2 Tetra Brownie1 Brownie3 Brownie4 Brownie5 NA NA
内容的提问来源于stack exchange,提问作者nik
相关产品推荐
相关产品推荐

