2017-10-21 34 views
1

私はRに新しいので、これが基本的な質問であればお詫び申し上げます。私は川の高さのデータが12k日間のdfを持っています。私は、川が> 28フィートのときにフィルターを作った。しかし今、私はこのフィルタリングされたdfを、連続したx> 28フィートの川のリストに分解したいと思います。例えば、川が> 20フィートの28フィートの場合、一緒にグループ化したいと思います。Rで日付を並べてリストを作る方法は?

library(dplyr) 

RawData <- read.csv("c:/Users/Anthony/Desktop/R/CSVRiverData.csv") 

RiverData <- cbind(data.frame(as.Date(RawData$Row.Labels, format = "%m/%d/%Y")), 
        RawData$Average.of.height) 

colnames(RiverData) <- c("Date","RiverHeight") 


Filt_River_Data <- filter(RiverData,RiverData$RiverHeight >28) 

Date_Diff <- data.frame(Filt_River_Data$Date - lag(Filt_River_Data$Date, 1L)) 
+0

を参照してください '?rle'。時々、 'data.table :: rleid'を盗むことは有用です。 %>%filter(RiverHeight> 28、n()> 20) '' $ 'の部分集合をで使用しないでください。 dplyr動詞;変数を直接参照するだけで、渡したデータフレームを調べることができます。 – alistaire

答えて

1

ここでは、連続した日数を取得し、それらをグループ化するための私の強引なアプローチです。どこかにもっと洗練されたソリューションがあるかもしれませんが、ここではループを使って簡単に行う方法があります。

# get some reasonable pseudo data 
library(forecast) 
rd <- rnorm(1010,mean=28,sd=10) 
rd <- forecast::ma(rd,order=10) 
rd <- rd[!(is.na(rd))] 
temp.dd <- seq.Date(as.Date("2000-01-01"),by=1,length.out=length(rd)) 
RiverData <- data.frame(temp.dd,rd) 
colnames(RiverData) <- c('Date','RiverHeight') 

# add vector to df and calculate number of consecutive days 
## assume that you want to calcualte # consecutive days based on raw data, not pre-filtered 
RiverData$numConDays <- rep(NA,nrow(RiverData)) 
count = 0 
h_thresh <- 28 
for (i in 1:nrow(RiverData)) { 
    if (RiverData$RiverHeight[i] >= h_thresh) { 
    count = count + 1 
    } else { 
    count = 0 
    } 
    RiverData$numConDays[i] <- count 
} 

# now you can filter as you wish 
## the first condition of > h_thresh shouldn't be necessary 
RiverDataSubset <- RiverData[(RiverData$RiverHeight > h_thresh & RiverData$numConDays > 20),] 
head(RiverDataSubset) 

# get the grouping for each set 
## assumes daily data 
RiverDataSubset$group <- rep(NA,nrow(RiverDataSubset)) 
gg <- 1 
RiverDataSubset$group[1] <- gg 
for (i in 2:nrow(RiverDataSubset)) { 
    if (as.numeric(difftime(RiverDataSubset$Date[i],RiverDataSubset$Date[i-1])) != 1) { 
    gg <- gg +1 
    } 
    RiverDataSubset$group[i] <- gg 
} 
+0

これは素晴らしい作品です!非常に感謝します。ありがとうございました。 – akennedy12345

関連する問題