R 从数据框中删除不完整的月份,即使部分月份包含数据

R 从数据框中删除不完整的月份,即使部分月份包含数据,r,data-management,R,Data Management,我想从我的数据框中删除不完整的月份,即使其中一些月份有数据 示例数据帧: date <- seq.Date(as.Date("2016-01-15"),as.Date("2016-09-19"),by="day") data <- seq(1:249) df <- data.frame(date,data) date您可以将每个月的一组完整日期加入到数据框中,然后过滤掉所有缺失值的月份 library(tidyverse) library(lubridate) df.fi

我想从我的数据框中删除不完整的月份,即使其中一些月份有数据

示例数据帧:

date <- seq.Date(as.Date("2016-01-15"),as.Date("2016-09-19"),by="day")
data <- seq(1:249)

df <- data.frame(date,data)

date您可以将每个月的一组完整日期加入到数据框中,然后过滤掉所有缺失值的月份

library(tidyverse)
library(lubridate)

df.filtered = data.frame(date=seq(min(df$date)-31,max(df$date)+31,by="day")) %>%
  left_join(df) %>%
  group_by(month=month(date)) %>%   # Add a month column and group by it
  filter(!any(is.na(data))) %>%     # Remove months with any missing data
  ungroup %>%                       
  select(-month)                    # Remove the month column

# A tibble: 213 x 2
         date  data
       <date> <int>
 1 2016-02-01    18
 2 2016-02-02    19
 3 2016-02-03    20
 4 2016-02-04    21
 5 2016-02-05    22
 6 2016-02-06    23
 7 2016-02-07    24
 8 2016-02-08    25
 9 2016-02-09    26
10 2016-02-10    27
# ... with 203 more rows
库(tidyverse)
图书馆(lubridate)
df.filtered=data.frame(日期=seq(最小(df$date)-31,最大(df$date)+31,by=“day”)%%>%
左联合(df)%>%
分组依据(月=月(日期))%>%#添加月列并按其分组
筛选(!any(is.na(data)))%>%#删除缺少数据的月份
解组%>%
选择(-month)#删除月份列
#A tibble:213 x 2
日期数据
1 2016-02-01    18
2 2016-02-02    19
3 2016-02-03    20
4 2016-02-04    21
5 2016-02-05    22
6 2016-02-06    23
7 2016-02-07    24
8 2016-02-08    25
9 2016-02-09    26
10 2016-02-10    27
# ... 还有203行

如果我正确解释了您的问题,您希望能够选择具有完整天数的月份,删除那些没有完整天数的月份

以下使用了dplyr v0.7.0

library(dplyr)

df <- df %>%
  mutate(mo = months(date)) # add month (mo)

complete_mo <- df %>%
  count(mo) %>% #count number of days in month (n)
  filter(n >= 28) %>% #rule of thumb definition of a `complete month`
  pull(mo)

df_complete_mo <- df %>%
  filter(mo %in% complete_mo) %>% # here is where you select the complete months
  select(-mo) #remove mo, to keep your original df
库(dplyr)
df%
变更(mo=月(日期))#添加月(mo)
完成百分比
计数(mo)%>%#计数月份天数(n)
过滤器(n>=28)%>%#`整月'的经验法则定义`
拉力(mo)
df_完成_mo%
过滤器(完工月百分比中的完工月百分比)%>%#这里是选择完工月的位置
选择(-mo)#删除mo,以保留原始df

然后,
df_complete\u mo
生成的数据集只包含完成的月份

在基数R中,您可以执行以下操作

# get start and end dates of months that are are beyond the sample
dateRange <- as.Date(format(range(df$date) + c(-32, 32), c("%Y-%m-2", "%Y-%m-1"))) - 1
现在,使用
which.max
选择匹配的第一个日期,使用
which
with
tail
选择匹配每月序列的最后一天,以确定data.frame的开始行和停止行

startRow <- which.max(df$date %in% seq(dateRange[1], dateRange[2], by="month"))
stopRow <- tail(which(df$date %in% (seq(dateRange[1], dateRange[2], by="month")-1)), 1)

startRow当我将您的代码应用于我的“真实”数据集时,我遇到以下错误:
最小值错误(df$date)-31:二进制运算符的非数字参数
。这与日期的格式有关吗?如果您的日期是字符格式而不是日期格式(日期格式实际上是一种数字格式,附加了日期类),那么您将得到一个错误。
dateRange
[1] "2015-12-01" "2016-09-30"
startRow <- which.max(df$date %in% seq(dateRange[1], dateRange[2], by="month"))
stopRow <- tail(which(df$date %in% (seq(dateRange[1], dateRange[2], by="month")-1)), 1)
dfNew <- df[startRow:stopRow,]

range(dfNew$date)
[1] "2016-02-01" "2016-08-31"
nrow(dfNew)
[1] 213