在每次滑动中从 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_id
、row_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
我有一个数据集,其中:
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_id
、row_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