R语言:删除cycle列重复且N列为0的数据行
问题描述
现有一个grouped_df类型的R数据框df,其中cycle列存在重复时间戳(比如第5-6行、第8-9行)。需要删除**cycle重复且对应N列为0**的行,保留cycle重复但N列非0的行;而cycle唯一且N=0的行则保留。
数据定义代码:
df <- structure(list(cycle = structure(c(1606782894, 1606786502, 1606790113, 1606793721, 1606800941, 1606800941, 1606804550, 1606808160, 1606808160, 1606845846), tzone = "UTC", class = c("POSIXct", "POSIXt")), N = c(0L, 0L, 0L, 0L, 0L, 3L, 0L, 0L, 1L, 0L)), class = c("grouped_df", "tbl_df", "tbl", "data.frame"), row.names = c(NA, -10L), groups = structure(list( cycle = structure(c(1606782894, 1606786502, 1606790113, 1606793721, 1606797332, 1606800941, 1606804550, 1606808160, 1606845846 ), tzone = "UTC", class = c("POSIXct", "POSIXt")), .rows = structure(list( 1L, 2L, 3L, 4L, 5L, 6L, 7L, 8:9, 10L), ptype = integer(0), class = c("vctrs_list_of", "vctrs_vctr", "list"))), class = c("tbl_df", "tbl", "data.frame" ), row.names = c(NA, -9L), .drop = TRUE))
原始数据展示:
# A tibble: 10 × 2 # Groups: cycle [9] cycle N <dttm> <int> 1 2020-12-01 00:34:54 0 2 2020-12-01 01:35:02 0 3 2020-12-01 02:35:13 0 4 2020-12-01 03:35:21 0 5 2020-12-01 05:35:41 0 6 2020-12-01 05:35:41 3 7 2020-12-01 06:35:50 0 8 2020-12-01 07:36:00 0 9 2020-12-01 07:36:00 1 10 2020-12-01 18:04:06 0
解决方法
dplyr实现(推荐)
利用dplyr的分组筛选功能,按cycle分组后,保留满足以下任一条件的行:
N不为0;- 该组只有一行(即
cycle唯一)且N为0。
代码:
library(dplyr) df_cleaned <- df %>% group_by(cycle) %>% filter(N != 0 | n() == 1) %>% ungroup() # 可选,若不需要保留分组结构可取消
基础R实现
如果不想依赖dplyr,可以用基础R逻辑处理:
# 计算每个cycle的出现次数 cycle_counts <- table(df$cycle) # 筛选符合条件的行 df_cleaned_base <- df[df$N != 0 | (df$N == 0 & cycle_counts[as.character(df$cycle)] == 1), ]
验证结果
运行上述代码后,清理后的数据如下:
# A tibble: 8 × 2 cycle N <dttm> <int> 1 2020-12-01 00:34:54 0 2 2020-12-01 01:35:02 0 3 2020-12-01 02:35:13 0 4 2020-12-01 03:35:21 0 5 2020-12-01 05:35:41 3 6 2020-12-01 06:35:50 0 7 2020-12-01 07:36:00 1 8 2020-12-01 18:04:06 0
可以看到,原数据中第5行、第8行(均为cycle重复且N=0)已被删除,对应N≠0的重复行被保留,所有cycle唯一且N=0的行也全部保留。
内容的提问来源于stack exchange,提问作者Wilson Souza
相关产品推荐
相关产品推荐

