我希望将值和日期对应于出现次数。 我使用这个功能,做我想要的非常好。
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列(年份,值)中的所有值?
答案 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
在月份中添加会增加运行次数,因为许多跨越月份边界。