enter image description here

J'ai la colonne X dans un dataframe et je souhaite créer le RolPos. La colonne RolPos est le décompte glissant des valeurs positives ayant une fenêtre glissante de 3 lignes. Une aide comment pourrais-je faire ça?

Données à utiliser:

df <- data.frame(x = c(0, 1, -3, -1, 1, -5, 3, -2))
0
user3203275 2 sept. 2020 à 14:12

3 réponses

Meilleure réponse

Vous pouvez utiliser runner. Pour plus de cas, consultez la documentation et les vignettes.

library(runner)
library(dplyr)

df <- data.frame(x = c(0, 1, -3, -1, 1, -5, 3, -2))

df %>%
  mutate(
    RolPos = runner(
      x = df$x,
      f = function(x) {
        sum(x > 0)  
      },
      k = 3
    )    
  )

# x RolPos
# 1  0      0
# 2  1      1
# 3 -3      1
# 4 -1      1
# 5  1      1
# 6 -5      1
# 7  3      2
# 8 -2      1
1
GoGonzo 2 sept. 2020 à 12:20

Vous pouvez cbind le retardé x et faire ensuite rowSums.

n <- length(x)
rowSums(cbind(x, c(0, x[1:(n-1)]), c(0, 0, x[1:(n-2)])) > 0)
#[1] 0 1 1 1 1 1 2 1
1
GKi 2 sept. 2020 à 11:24

Je suggérerais cette approche slider avec une fonction pour compter les valeurs positives:

library(slider)
library(dplyr)
#Data
df <- data.frame(x=c(0,1,-3,-1,1,-5,3,-2))
#Function
getpos <- function(x) 
{
  y <- length(which(x>0))
  return(y)
}
# Rolling by group
df %>% 
  mutate(rolling = slide_dbl(x, getpos, .before = 2, .complete = FALSE))

Production:

   x rolling
1  0       0
2  1       1
3 -3       1
4 -1       1
5  1       1
6 -5       1
7  3       2
8 -2       1
1
Duck 2 sept. 2020 à 11:22