Estoy tratando de repetir la secuencia 0, 1, 2 abajo de las filas de mi marco de datos con lo siguiente:

x <- c(1, 2, 3, 4, 5, 6, 7)
y <- c(1, 2, 3, 4, 5, 6, 7)

df <- cbind(x, y)
df <- as.data.frame(df)

df$W <- rep(0:2, nrow(df)/3)
df$W <- rep(0:1, nrow(df)/2)

Lo que no funciona porque el reemplazo tiene 6 filas, los datos tienen 7. Tengo que haber una solución más sencilla para esto. Solo quiero que comience la siguiente secuencia, pero deje de que termine en la última fila del marco de datos. SO W solo sería 0, 1, 2, 0, 1, 2, 0. y para la otra opción con rep(0:1) Sería 0, 1, 0, 1, 0, 1, 0

3
Sam Pickwick 9 jun. 2021 a las 02:08

2 respuestas

La mejor respuesta

Usa la length.out opción

rep(0:2, length.out = nrow(df))
#[1] 0 1 2 0 1 2 0
rep(0:1, length.out = nrow(df))
#[1] 0 1 0 1 0 1 0
3
akrun 8 jun. 2021 a las 23:09

Puedes usar aritmética modular.

Aquí hay dos impelimnaciones usando data.table y dplyr

## data.table
library(data.table)

setDT( df )[, w := (.I - 1 ) %% 3][]
## .I is what data.table uses to store 'row number'
## think of it as the row 'index'

#    x y w
# 1: 1 1 0
# 2: 2 2 1
# 3: 3 3 2
# 4: 4 4 0
# 5: 5 5 1
# 6: 6 6 2
# 7: 7 7 0

## dplyr
library(dplyr)

df %>%
  mutate(w = (row_number() - 1) %% 3)

#   x y w
# 1 1 1 0
# 2 2 2 1
# 3 3 3 2
# 4 4 4 0
# 5 5 5 1
# 6 6 6 2
# 7 7 7 0

Para el 0, 1, la secuencia usa %% 2

2
SymbolixAU 8 jun. 2021 a las 23:30