如何按R中的某一行的日期列出一个列表?

问题描述:

我是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

这是我的蛮力方法来获取连续天数,然后对它们进行分组。在某处可能有一个更优雅的解决方案,但这是一个简单的方法来处理循环。

# 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