在每次滑动中从 1 的运行中获取 1 的总数 window

Get total number of 1s from runs of 1 in every sliding window

我有一个数据集,其中:

df <- data.frame(row_id = c(100, 101, 102, 103, 104, 105, 106, 107, 108, 109),
         row_id2 = c(1000,2000,3000,4000,5000,6000,7000,8000,9000,10000),
         col1 = c(1,0,1,1,1,0,0,1,1,0),
         col2 = c(1,1,1,0,0,1,1,1,0,0),
         col3 = c(0,0,1,0,0,1,1,1,1,0),
         col4 = c(1,1,1,0,0,1,0,1,1,1),
         col5 = c(1,1,1,0,1,0,1,0,0,1))

我必须转置 table,然后添加一个新列 pos 来为每一行分配一个带有数值的 col 前缀:

library(data.table)
df_tr<-transpose(df)
rownames(df_tr)<-colnames(df)
df_tr$pos<-c("NA","NA",1000,1156,4629,8208,10000)

|       |  V1    V2    V3   V4   V5   V6   V7   V8   V9   V10   pos|
|row_id |  100   101  102  103  104  105  106  107  108   109    NA|
|row_id2| 1000  2000  3000 4000 5000 6000 7000 8000 9000 10000   NA|
|col1   |    1     0    1    1    1    0    0    1    1     0  1000|
|col2   |    1     1    1    0    0    1    1    1    0     0  1156|
|col3   |    0     0    1    0    0    1    1    1    1     0  4629|
|col4   |    1     1    1    0    0    1    0    1    1     1  8208|
|col5   |    1     1    1    0    1    0    1    0    0     1 10000|

使用 pos 中的值,对于每一列,我想使用大小为 2000 的滑动 windows,一次滑动 1000,从运行中获取 1 的总数每个 window 中有 1 个。 (我想排除独立的 1s)。 window滑动从1000开始,对应col1,到10000结束,对应col5.

我想创建一个单独的 table,其中第一列和第二列为 row_idrow_id2,然后对应于每个滑动的列 window关注

例如,前几行的最终输出为:

|row_id |row_id2 |window1 |window2 |window3 |window4 |window5 |window6 |window7 |window8 |
| 100   |  1000  |   2    |   0    |   0    |  0     |   0    |  0     |  0     |   2    |
| 101   |  2000  |   0    |   0    |   0    |  0     |   0    |  0     |  0     |   2    |
| 102   |  3000  |   2    |   0    |   0    |  0     |   0    |  0     |  0     |   2    |
| 103   |  4000  |   0    |   0    |   0    |  0     |   0    |  0     |  0     |   0    |

任何帮助将不胜感激,谢谢!

我更改了 pos 使其成为数字。
我还将 df_tr 转换为 data.table 以使其更易于使用。
最后的答案还是一个data.frame.

df_tr$pos<-c(NA_real_,NA_real_,1000,1156,4629,8208,10000)

setDT(df_tr)
window_list <- vector('list')
for (i in 1:8) {
  window_list[[i]] <- 
    df_tr[!is.na(df_tr$pos) & df_tr$pos %between% c(1000 * i, 1000 * i + 2000), 
          sapply(.SD, \(x) {
            y <- rle(x)
            z <- y[['lengths']][y[['values']] == 1]
            sum(z[z > 1])
          }), .SDcols = patterns('V')]
}
ans <- cbind(df[, 1:2], do.call('cbind', window_list))
setnames(ans, as.character(1:8), paste0('window', 1:8))
ans <- `rownames<-`(ans, NULL)
ans
   row_id row_id2 window1 window2 window3 window4 window5 window6 window7
1     100    1000       2       0       0       0       0       0       0
2     101    2000       0       0       0       0       0       0       0
3     102    3000       2       0       0       0       0       0       0
4     103    4000       0       0       0       0       0       0       0
5     104    5000       0       0       0       0       0       0       0
6     105    6000       0       0       0       0       0       0       0
7     106    7000       0       0       0       0       0       0       0
8     107    8000       2       0       0       0       0       0       0
9     108    9000       0       0       0       0       0       0       0
10    109   10000       0       0       0       0       0       0       0
   window8
1        2
2        2
3        2
4        0
5        0
6        0
7        0
8        0
9        0
10       2