2017-10-21 69 views
1

我是R新手,所以如果這是一個基本問題,我很抱歉。我有一個12k天的河流高度數據。當河流> 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'是很有用的,例如, 'RiverData%>%group_by(days_above_28 = data.table :: rleid(RiverHeight> 28))%>%filter(RiverHeight> 28,n()> 20)'還要注意,你不應該使用'$'subsetting in 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

相關問題