2017-06-22 78 views
1

即使某些月份有數據,我想從數據框中刪除不完整的月份。即使部分月份包含數據,也可從數據框中刪除不完整的月份

示例數據幀:

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

df <- data.frame(date,data) 

我想什麼:

date2 <- seq.Date(as.Date("2016-02-01"),as.Date("2016-08-31"),by="day") 
data2 <- seq(from = 18, to = 230) 

df2 <- data.frame(date2,data2) 

回答

1

如果我正確地解釋你的問題,你希望能夠選擇具有天的完整的數個月,除去那些不這樣做。

下使用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 

然後df_complete_mo得到你的數據集只是整月

1

你可以加入了一套完整的日期爲每個月的數據幀,然後過濾掉個月的任何缺失值。

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 
+0

當我申請你的代碼,以我的 「真實」 的數據集,我收到以下錯誤:在分鐘(DF $日期)'錯誤 - 31:非二進制運算符的非數字參數。這與日期格式有關嗎? – phaser

+0

如果你的日期是字符格式而不是日期格式(日期格式實際上是一個附有Date類的數字格式),那麼你會得到一個錯誤。 – eipi10

0

在基準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 

格式的第二個參數是一個向量,分別格式化最小和最大日期。我們從這些日期中減去1以得到一個月的第一天和一個月的最後一天。這將返回

dateRange 
[1] "2015-12-01" "2016-09-30" 

現在,使用which.max來選擇匹配的第一個日期和whichtail選擇,爲了弄清楚開始和你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) 

,子集您data.frame

dfNew <- df[startRow:stopRow,] 

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