如何用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
相关产品推荐
相关产品推荐

