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

R语言:按id分组删除dates重复且inst为NA的行

按ID分组删除指定重复行的R实现方法

需求:按id分组,删除同一组内dates值重复且对应inst为NA的行;若同一id+dates组内只有inst为NA的行,则保留该行。

原始数据

id <- c("N101", "N102", "N103", "N103", "N103", "N103", "N104", "N105", "N107", "N107", "N108", "N109", "N110", "N111", "N112", "N113", "N114", "N115", "N116", "N116")
inst <- c("angers", "strasbourg",  NA, "angers", "montpellier", NA, "rouen", "limoges", NA, "brest", "stanne", "aphp_psl", "stanne", "strasbourg", "clairval", "stanne", "stanne", "caen", NA, "brest")
dates <- c("2008-07-13", "2008-02-13", "2008-05-13", "2008-05-13", "2010-12-14", "2011-12-19", "2013-11-12", "2014-01-31", "2008-06-13", "2009-06-09", "2009-03-10", "2008-12-10", "2010-04-15", "2008-01-13", "2017-03-13", "2014-05-14", "2012-05-15", "2009-10-22", "2010-10-18", "2011-05-03")
df1 <- data.frame(id, inst, dates)

示例中需删除第3行(N103、NA、2008-05-13),因为同一id=N103组内存在相同dates且inst非NA的行。

解决方案

方法1:使用dplyr包(tidyverse生态)

代码简洁直观,适合日常数据处理:

# 若未安装dplyr,先执行安装:install.packages("dplyr")
library(dplyr)

df2 <- df1 %>%
  group_by(id, dates) %>%
  # 排除:inst为NA且当前(id,dates)组内存在非NA行的记录
  filter(!(is.na(inst) & n() > 1)) %>%
  ungroup()

方法2:使用base R实现

无需加载额外包,适合轻量场景:

# 计算每个(id,dates)组内非NA的inst数量
df1$non_na_count <- ave(!is.na(df1$inst), df1$id, df1$dates, FUN = sum)

# 筛选符合要求的行:要么inst非NA,要么inst为NA但组内无对应非NA行
df2 <- df1[!(is.na(df1$inst) & df1$non_na_count > 0), ]

# 清理临时辅助列
df2$non_na_count <- NULL

结果验证

可通过以下代码确认处理后的数据与目标数据一致:

# 目标数据
id_target <- c("N101", "N102", "N103", "N103", "N103", "N104", "N105", "N107", "N107", "N108", "N109", "N110", "N111", "N112", "N113", "N114", "N115", "N116", "N116")
inst_target <- c("angers", "strasbourg", "angers", "montpellier", NA, "rouen", "limoges", NA, "brest", "stanne", "aphp_psl", "stanne", "strasbourg", "clairval", "stanne", "stanne", "caen", NA, "brest")
dates_target <- c("2008-07-13", "2008-02-13", "2008-05-13", "2010-12-14", "2011-12-19", "2013-11-12", "2014-01-31", "2008-06-13", "2009-06-09", "2009-03-10", "2008-12-10", "2010-04-15", "2008-01-13", "2017-03-13", "2014-05-14", "2012-05-15", "2009-10-22", "2010-10-18", "2011-05-03")
df_target <- data.frame(id_target, inst_target, dates_target)
colnames(df_target) <- colnames(df1)

# 验证一致性
all.equal(df2, df_target)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.11 08:25:20