R 中滑动窗口数据帧中最常见的值



>我有以下数据帧(df(:

A                    B           T    Required col (window = 3)
1   1                    0           1     
2   3                    0           3   
3   4                    0           4        
4   2                    1           1        4
5   6                    0           0        2
6   4                    1           1        0
7   7                    1           1        1
8   8                    1           1        1
9   1                    0           0        1

我想添加所需的列,如下所示: 在当前行中插入上一行值AB。 如果在最后3(window(行中大部分时间A列的内容等于T列 - 选择A,否则 -B。(可以有更多的列 - 因此将选择次数最多等于 T 的列的内容(。 对于大数据表,最有效的方法是什么。

我将名为T的列更改为命名为TC,以避免与T混淆,TRUE的缩写

library(tidyverse)
library(data.table)
df[, newcol := {
equal <- A == TC
map(1:.N, ~ if(.x <= 3) NA
else if(sum(equal[.x - 1:3]) > 3/2) A[.x - 1] 
else B[.x - 1])
}]
df
#    N A B TC newcol
# 1: 1 1 0  1     NA
# 2: 2 3 0  3     NA
# 3: 3 4 0  4     NA
# 4: 4 2 1  1      4
# 5: 5 6 0  0      2
# 6: 6 4 1  1      0
# 7: 7 7 1  1      1
# 8: 8 8 1  1      1
# 9: 9 1 0  0      1

这也有效,但不太清楚,而且效率可能较低

df[, newcol := shift(A == TC, 1:3) %>% 
pmap_lgl(~sum(...) > 3/2) %>% 
ifelse(shift(A), shift(B))]

数据:

df <- fread("
N    A                    B           TC   
1   1                    0           1     
2   3                    0           3   
3   4                    0           4        
4   2                    1           1        
5   6                    0           0        
6   4                    1           1        
7   7                    1           1        
8   8                    1           1        
9   1                    0           0        
")

可能比 Ryan 的答案效率低得多,但没有额外的软件包。

A<-c(1,3,4,2,6,4,7,8,1)
B<-c(0,0,0,1,0,1,1,1,0)
TC<-c(1,3,4,1,0,1,1,1,0)
req<-rep(NA,9)
df<-data.frame(A,B,TC,req)
window<-3
for(i in window:(length(req)-1)){
equal <- sum(df$A[(i-window+1):i]==df$TC[(i-window+1):i])
if(equal > window/2){
df$req[i+1]<-df$A[i]  
}else{
df$req[i+1]<-df$B[i]
}
}

最新更新