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

如何用dplyr依据列字符值移除Data Frame中的重复行?

按特定条件过滤DataFrame:保留id对应的analysisB行(当同时存在两种分析结果时)

我来帮你解决这个问题!你的需求是当某个id_no同时存在analysisA和analysisB时只保留analysisB的行,其他情况保留所有行——用dplyr完全可以实现,核心是先按id分组,再针对每个组的情况做过滤逻辑。

第一步:重现示例数据

先把你提供的示例数据还原出来,方便测试:

# 你的示例数据
df <- structure(list(id_no = structure(c(1L, 2L, 2L, 3L, 4L, 4L), .Label = c("A", "B", "C", "D"), class = "factor"), 
                     column_A = structure(c(1L, 1L, 2L, 2L, 1L, 2L), .Label = c("analysisA", "analysisB"), class = "factor")), 
                .Names = c("id_no", "column_A"), row.names = c(NA, -6L), class = "data.frame")

方法一:分组+条件过滤(最直观的逻辑)

这个方法完全贴合你的需求描述,逻辑清晰易懂:

library(dplyr)

filtered_df <- df %>%
  group_by(id_no) %>%
  filter(
    # 核心逻辑:如果组内存在analysisB,只保留analysisB的行;否则保留所有行
    ifelse("analysisB" %in% column_A, column_A == "analysisB", TRUE)
  ) %>%
  ungroup()

# 查看结果
print(filtered_df)

方法二:利用排序快速筛选(更简洁)

观察你的数据,column_A是因子类型,且analysisB的水平值(2)比analysisA(1)更高。我们可以直接用slice_max每个组取排序最靠前的行:

filtered_df <- df %>%
  group_by(id_no) %>%
  slice_max(order_by = column_A, n = 1) %>% # 取每个组中column_A排序最高的一行
  ungroup()

print(filtered_df)

如果你的column_A是字符型(不是因子),也可以先排序再取首行:

filtered_df <- df %>%
  mutate(column_A = as.character(column_A)) %>%
  group_by(id_no) %>%
  arrange(desc(column_A)) %>% # 把analysisB排在组内最前面
  slice(1) %>%
  ungroup()

最终输出结果

两种方法都会得到你期望的结果:

id_no column_A
1     A analysisA
2     B analysisB
3     C analysisB
4     D analysisB

为什么单独用filter()没成功?

单独使用filter()无法感知每个id_no组内的整体情况——它只会逐行判断条件,而我们的需求需要先知道当前id是否同时存在两种分析结果,所以必须先通过group_by(id_no)把数据按id分组,再针对每个组做过滤逻辑。

内容的提问来源于stack exchange,提问作者Haakonkas

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.27 07:17:41