循环后检测日期并将结果值存储在另一个文件中

时间:2014-05-30 12:36:11

标签: r loops

我希望将值和日期对应于出现次数。 我使用这个功能,做我想要的非常好。

 count <- function(df, min_build, min_days) {
 sum(with(rle(df$build > min_build), values & lengths >= min_days))}

我的数据如下:

data = data.frame(station, build, dates, Year, Month, day)

   station build     dates  Year Month day 
1   Bariko 24.5 1960-01-01  1960     1   1    
2   Bariko 29.1 1960-01-02  1960     1   2    
3   Bariko 26.4 1960-01-03  1960     1   3    
4   Bariko 29.0 1960-01-04  1960     1   4    
5   Bariko 22.0 1960-01-05  1960     1   5    
6   Bariko 25.9 1960-01-06  1960     1   6    
7   Bariko 24.2 1960-01-07  1960     1   7    
8   Bariko 23.9 1960-01-08  1960     1   8    
9   Bariko 24.4 1960-01-09  1960     1   9    
10  Bariko 24.0 1960-01-10  1960     1  10    
11  Bariko 24.2 1960-01-11  1960     1  11    
12  Bariko 24.8 1960-01-12  1960     1  12    
13  Bariko 25.4 1960-01-13  1960     1  13 

h <- count(data, 24, 4)     # I have the right number but for all 10 years(1960-1969)

#I split my data by year  to have the value for each year.
    g <- data$Year
    l <- split(data, g)
    k=l$'1962'
    h <- count(k, 24, 4)    # I repeat this 10 times (for each year)

我的问题:

1.如何检测与我的计数相对应的天数?

2.如何循环获取2列(年份,值)中的所有值?

1 个答案:

答案 0 :(得分:1)

我很惊讶你有这样一个花哨的R计数功能,但不知道如何在列表中应用函数。

但首先让我们从寻找与计数相对应的日子开始。首先,我已经更新了样本数据,实际上可以在更多年内实现更多运行。 (简化只有2个月,每个只有5天)

data<-data.frame(
    Year=rep(1960:1969, each=10),
    Month=rep(1:2,2),
    Day=rep(1:5, each=2),
    build=24 + sin(1:100/4)*1.5
)

因此,我不会明确地找到日期,而是会找到行索引,其中包含这两个函数的运行开始(和结束)。

findstart <- function(df, min_build, min_days) {
with(rle(df$build > min_build), 
    head(cumsum(c(1,lengths)),-1)[values & lengths >= min_days])} 

findrange <- function(df, min_build, min_days) {
with(rle(df$build > min_build), {m<-values & lengths >= min_days; 
    s<-head(cumsum(c(1,lengths)),-1); cbind(s[m], s[m]+lengths[m]-1)})}

它们将像count一样工作,但会返回起始索引,或者将起点/终点作为矩阵返回

(f <- findstart(data, 24, 4))
# [1]  1 26 51 76

(fr <- findrange(data, 24, 4))
#      [,1] [,2]
# [1,]    1   12
# [2,]   26   37
# [3,]   51   62
# [4,]   76   87

然后将您的计数功能应用到您的列表并获取您想要的数据,您可以

g <- data$Year
l <- split(data, g)
data.frame(n=sapply(l, count, 24, 4))
#      n
# 1960 1
# 1961 0
# 1962 1
# 1963 1
# 1964 0
# 1965 1
# 1966 0
# 1967 1
# 1968 1
# 1969 0

在月份中添加会增加运行次数,因为许多跨越月份边界。