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

如何基于每行字符串去除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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.09 06:05:24