满足条件的天数的连续计数

时间:2018-11-26 21:44:48

标签: r

这是一个很难表达的非常困难的问题,我已经访问了SO上的许多帖子,而没有找到解决该问题的方法。

我有2个尺寸相同的数据帧(实际上,每个数据帧均为983 27,但在此示例中为10 x 5)。

df1 <- data.frame(v=runif(10),w=runif(10),x=runif(10),y=runif(10),z=runif(10))
df2 <- data.frame(v=runif(10),w=runif(10),x=runif(10),y=runif(10),z=runif(10))

df1
            v          w          x           y          z
1  0.47183652 0.22260903 0.22871379 0.549137695 0.19310086
2  0.26030258 0.33811230 0.66651066 0.432569755 0.88964481
3  0.99671428 0.87778858 0.76554728 0.486628372 0.28298038
4  0.51320543 0.62279625 0.52370766 0.003457935 0.20230251
5  0.09182823 0.88205170 0.43630438 0.308291706 0.03875207
6  0.29005832 0.96372511 0.65346596 0.411204978 0.22091272
7  0.76790152 0.47633721 0.79825487 0.329127652 0.48165651
8  0.85939833 0.70695256 0.05128899 0.631819822 0.26584177
9  0.14903837 0.09196876 0.56711615 0.443217700 0.33934426
10 0.79928314 0.15035157 0.82297350 0.203435449 0.21088680

df2
           v         w          x          y          z
1  0.9733651 0.1407513 0.32073105 0.18886833 0.76234111
2  0.9009754 0.1303898 0.48968741 0.45347721 0.78475371
3  0.8460530 0.6597701 0.20024460 0.59079853 0.63302668
4  0.9879135 0.2348028 0.73954442 0.70185877 0.23834780
5  0.5748540 0.4139660 0.79869841 0.02760473 0.99871034
6  0.9164362 0.7166881 0.25280647 0.35890724 0.03500226
7  0.1302808 0.3734517 0.25132321 0.67417021 0.57109357
8  0.1114569 0.7319093 0.57513770 0.11055742 0.86348983
9  0.6596877 0.5261662 0.50796080 0.95685045 0.17689039
10 0.8299933 0.8244658 0.04408135 0.33849748 0.96904940

我需要遍历每一列,对于每一天T,同时为两个数据帧计算(T-1,T-2,T-3 ... Tn)

步骤将是:

  1. 例如,在第T = 2天,考虑df1 [ 2 ,1](即0.26030258),然后返回并标记T = 2之前的任何少于0.26030258的天。由于我们以T = 2为例,因此唯一的先验观察结果是df1 [1,1]。如果df1 [1,1] IF

  2. df2 [1,1]比还小 df2 [ 2 ,1]

  3. 最后,仍然以 T = 2 为例,将1的数量相加并除以观察数量,以生成 T = 2 的频率。

同样,我需要在983个日期和27列中执行此操作。我已经尝试过使用rollify的各种方法以及包装在sapply中的各种函数,但是考虑到countif标准的动态宽度,这非常具有挑战性,更不用说同时在两个DF上执行了。

2 个答案:

答案 0 :(得分:1)

我认为是这样的:

m1 = as.matrix(df1)
m2 = as.matrix(df2)
results = matrix(nrow = nrow(df1) - 1, ncol = ncol(df1))
colnames(results) = names(df1)

for(i in 2:nrow(df1)) {
  results[i - 1, ] = rowSums(t(m1[1:(i - 1), , drop = FALSE]) < m1[i, ] & t(m2[1:(i - 1), , drop = FALSE]) < m2[i, ]) / (i - 1)
}

results
 #              v   w         x         y         z
 # [1,] 0.0000000 1.0 1.0000000 0.0000000 0.0000000
 # [2,] 0.5000000 0.0 0.0000000 0.0000000 1.0000000
 # [3,] 0.0000000 0.0 0.3333333 0.6666667 0.6666667
 # [4,] 0.2500000 0.0 0.0000000 0.0000000 0.0000000
 # [5,] 0.0000000 0.4 0.4000000 0.6000000 0.6000000
 # [6,] 0.0000000 0.0 0.3333333 0.0000000 0.1666667
 # [7,] 0.0000000 0.0 0.4285714 0.0000000 0.2857143
 # [8,] 0.1250000 0.5 0.6250000 0.5000000 0.8750000
 # [9,] 0.2222222 0.0 0.4444444 0.4444444 0.2222222

由于您尚未回复评论,所以有一些猜测,但是如果我的假设是错误的,应该可以轻松修改。

答案 1 :(得分:1)

对于第一个df:

df1_result <- matrix(nrow = 10, ncol = 5)

for(j in 1:ncol(df1)){
    for(i in 1:nrow(df1)){
        df1_result[i, j] <- df1 %>%
            filter(df1[ ,j] < df1[i, j] & row_number() < i) %>%
            nrow()
    }
}

结果:

> df1_result
      [,1] [,2] [,3] [,4] [,5]
 [1,]    0    0    0    0    0
 [2,]    1    0    1    0    1
 [3,]    0    1    0    2    0
 [4,]    2    1    1    2    0
 [5,]    4    3    3    2    1
 [6,]    2    2    3    5    2
 [7,]    4    4    6    0    2
 [8,]    4    7    2    1    2
 [9,]    0    3    5    3    5
[10,]    6    7    5    8    9

当您回复评论时,会很高兴地展开。

数据

set.seed(1701)
df1 <- data.frame(v=runif(10),w=runif(10),x=runif(10),y=runif(10),z=runif(10))
df2 <- data.frame(v=runif(10),w=runif(10),x=runif(10),y=runif(10),z=runif(10))

> df1
             v          w         x          y         z
1  0.127393428 0.85600486 0.4791849 0.55089910 0.9201376
2  0.766723202 0.02407293 0.8265008 0.35612092 0.9279873
3  0.054421675 0.51942589 0.1076198 0.80230714 0.5993939
4  0.561384595 0.20590965 0.2213454 0.73043828 0.1135139
5  0.937597936 0.71206404 0.6717478 0.72341749 0.2472984
6  0.296445079 0.27272126 0.5053170 0.98789408 0.4514940
7  0.665117463 0.66765977 0.8849426 0.04751297 0.3097986
8  0.652215607 0.94837341 0.3560469 0.06630861 0.2608917
9  0.002313313 0.46710461 0.5732139 0.55040341 0.5375610
10 0.661490602 0.84157353 0.5091688 0.95719901 0.9608329