根据月份删除 ID

标签 r dplyr lubridate

我有一个从 2010 年 1 月 1 日到 2012 年 12 月末的数据集。我想识别 ID存在特定月份,然后过滤所有这些 ID从数据集中筛选出这些 ID 的特定月份s。

例如: 如果ID缺少“B”Month 2(没有在下面的数据集中模拟),我想删除 ID整个数据集中的“B”,并保留 A、C 和 D 以及数据集中的所有月份 ID完好无损。

我该怎么做?

library(lubridate)
library(tidyverse)
date <- rep_len(seq(dmy("01-01-2010"), dmy("31-12-2011"), by = "days"), 5000)
ID <-  rep(c("A","B","C"), 5000)
df <- data.frame(date = date,
                 x = runif(length(date), min = 60000, max = 80000),
                 y = runif(length(date), min = 800000, max = 900000),
                 ID)

df$jDate <- yday(as.Date(df$date))
df$Month <- month(df$date)
df$year <- year(df$date)

set.seed(1234)
drop_rows <- sapply(sample(1:nrow(df), 3), function(i) {
  return(i:(i+100))
}, simplify = FALSE) %>% unlist()

df <- df[-c(drop_rows), ]

最佳答案

我们可以按“年”和“ID”分组,获取不同(n_distinct)“月”的数量,在过滤器中检查它是否等于12 >。如果“年份”、“ID”没有 12 个唯一的月份,则会被删除

library(dplyr)
df %>%
   group_by(year, ID) %>% 
   filter(n_distinct(Month) == 12) %>% 
   ungroup

关于根据月份删除 ID,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/70634888/

相关文章:

R:使用lubridate计算年龄

r - 如何将 UTC 时间戳转换为 R Data Frame 中的多个本地时区?

r - 文章中的交叉引用

r - 是否有更有效/更干净的方法来设置 eval(parse(paste0( 设置?

r - 使用 for 循环对数据集进行分区

r - 与 R Shiny App 的自动化交互

r - 使用 R dplyr 根据多个条件找到最佳组合

r - Lubridate 未在 R 中正确将日期时间转换为 POSIXct (dd/mm/yy hh :mm:ss)

用带标签的增量键替换 NA 值

r - 格式化dplyr链中的列