根据列中重复值删除行,保留每组最后一行
解决方案
先分析你之前的代码问题:
- 第二段代码
distinct(Value, .keep_all = TRUE)逻辑错误:该函数默认保留每组重复值的第一行,和你需要保留最后一行的需求不符,所以结果不符合预期。 - 第一段代码理论上是正确的,但可能因为未加载
dplyr包、变量名不匹配(比如你用df但实际数据框叫data),或者数据读取时未正确处理分号分隔,导致执行失败。
下面是几种可行的正确方法:
方法1:dplyr 分组取每组最后一行(修正你的原代码)
确保先加载dplyr包,且变量名匹配:
library(dplyr) # 正确读取分号分隔的数据(如果还未读取) df <- read.table(text = "Row;Value 1;200 2;300 3;300 4;600 5;450 6;450", sep = ";", header = TRUE) # 过滤保留每组重复值的最后一行 filtered_df <- df %>% group_by(Value) %>% filter(row_number() == n()) %>% # n()代表每组的总行数,row_number()==n()即取组内最后一行 ungroup() # 可选,取消数据的分组状态 # 查看结果 print(filtered_df)
也可以用更直观的slice_tail替代filter:
filtered_df <- df %>% group_by(Value) %>% slice_tail(n = 1) %>% ungroup()
方法2:Base R 简洁实现
无需加载额外包,利用duplicated函数的fromLast参数:
# 读取数据(同上) df <- read.table(text = "Row;Value 1;200 2;300 3;300 4;600 5;450 6;450", sep = ";", header = TRUE) # fromLast=TRUE 会标记除最后一次出现外的所有重复值,取反后保留最后一行 filtered_df <- df[!duplicated(df$Value, fromLast = TRUE), ] print(filtered_df)
两种方法都会得到你想要的结果:
Row Value 1 1 200 2 3 300 3 4 600 4 6 450
内容的提问来源于stack exchange,提问作者TomTe
相关产品推荐
相关产品推荐

