我有一個數據集,其中:
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))
我必須轉置表格,然後添加一個新列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 的滑動窗口,一次滑動 1000,以從每個窗口中的 1 次運行中獲得 1 的總數。(我想排除獨立的 1)。窗口滑動將從 1000 開始,對應col1
於 10000,對應於col5
。
我想創建一個單獨的表,其中第一列和第二列是row_id
, row_id2
,然後是與每個滑動窗口對應的列。
例如,前幾行的最終輸出將是:
|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
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句