Я пытаюсь повторить последовательность 0, 1, 2 по строкам моего фрейма данных со следующим:

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)

Это не работает, потому что в замене 6 строк, а в данных 7. Я чувствую, что должно быть более простое решение. Я просто хочу, чтобы он запускал следующую последовательность, но останавливался, когда она заканчивается на последней строке фрейма данных. Таким образом, W будет просто 0, 1, 2, 0, 1, 2, 0. А для другого варианта с rep(0:1) это будет 0, 1, 0, 1, 0, 1, 0

3
Sam Pickwick 9 Июн 2021 в 02:08

2 ответа

Лучший ответ

Используйте параметр length.out

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 Июн 2021 в 23:09

Вы можете использовать модульную арифметику.

Вот два варианта использования data.table и 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

Для 0, 1 используйте последовательность %% 2

2
SymbolixAU 8 Июн 2021 в 23:30