Мне поручено создать вектор

0 1 0 1 0 1 0 1 0 1

С использованием двух подходов без с использованием c() или rep() в R.

Я пробовал кучу методов, но ни один из них не работает.

Вот некоторые из моих попыток (все они потерпели неудачу) -

vector(0, 1, 0, 1, 0, 1, 0, 1, 0, 1)


a<-seq(from = 0, to = 1 , by = 1)
a
replicate(5, a)


b<-1*(0:1)
do.call(cbind, replicate(5, b, simplify=FALSE))

Любая помощь по этому поводу будет оценена! Спасибо.

r
3
user1993 18 Сен 2021 в 00:27

5 ответов

Лучший ответ

Мы можем использовать bitwAnd

> bitwAnd(0:9, 1)
 [1] 0 1 0 1 0 1 0 1 0 1

Или kronecker

> kronecker(as.vector(matrix(1, 5)), 0:1)
 [1] 0 1 0 1 0 1 0 1 0 1

> kronecker((1:5)^0, 0:1)
 [1] 0 1 0 1 0 1 0 1 0 1

Или outer

> as.vector(outer(0:1, (1:5)^0))
 [1] 0 1 0 1 0 1 0 1 0 1
8
ThomasIsCoding 17 Сен 2021 в 21:46

Решение 1. Обобщенная функция my_rep()

Обобщенное решение my_rep() для любого вектора x, который вы хотите повторить n раз

my_rep <- function(x, n) {
  return(
    # Use modulo '%%' to subscript the original vector (whose length I'll call "m"), by
    # cycling 'n' times through its indices.
    x[0:(length(x) * n - 1) %% length(x) + 1]
      #  1  2  ...  m   1  2  ...  m       1  2  ...  m 
      # | 1st cycle  | | 2nd cycle  | ... | nth cycle  |
  )
}

Который может решить этот случай

my_rep(x = 0:1, n = 5)
#  [1] 0 1 0 1 0 1 0 1 0 1

И много других

# Getting cute, to make a vector of strings without using 'c()'.
str_vec <- strsplit("a b  ", split = " ")[[1]]
str_vec
# [1] "a" "b" ""

my_rep(x = str_vec, n = 3)
# [1] "a" "b" ""  "a" "b" ""  "a" "b" "" 

Решение 2: двоичный вектор произвольной длины

Еще одно быстрое решение для вектора 0 1 0 1 ... 0 1 произвольной длины l

# Whatever length you desire.
l <- 10

# Generate a vector of alternating 0s and 1s, of length 'l'.
(1:l - 1) %% 2

Что дает результат:

[1] 0 1 0 1 0 1 0 1 0 1

Заметка

Особая благодарность @Adam, которые выяснили 0:9 %% 2 самостоятельно вскоре после < href = "https://stackoverflow.com/posts/comments/122361438"> мой комментарий с тем же решением; и которые изящно отказались от своего первоначального ответа в пользу моего. :)

3
Greg 17 Сен 2021 в 22:45

Использование логического принуждения.

+(1:10*c(-1, 1) > 0)
# [1] 0 1 0 1 0 1 0 1 0 1

Или без c().

+(1:10*(0:1*2) - 1 > 0)
# [1] 0 1 0 1 0 1 0 1 0 1
2
jay.sf 17 Сен 2021 в 22:04

Вот способ использования функций apply.

unlist(lapply(1:5, function(x) 0:1))
# [1] 0 1 0 1 0 1 0 1 0 1

Аналогично, но с репликацией.

as.vector(replicate(5, 0:1))
# [1] 0 1 0 1 0 1 0 1 0 1

И на всякий случай любите триггеры.

abs(as.integer(cos((1:10 * pi) / 2)))
# [1] 0 1 0 1 0 1 0 1 0 1

И вот еще одно, что я считаю обманом просто потому, что. Этот обобщается на любой вектор, который вы хотите!

unlist(unname(read.table(textConnection("0 1 0 1 0 1 0 1 0 1"))))
2
Adam 17 Сен 2021 в 22:16

Мы можем использовать purrr :: accumulate и простую операцию отрицания (!)

purrr::accumulate(0:9, ~!.x)

[1] 0 1 0 1 0 1 0 1 0 1
1
GuedesBF 18 Сен 2021 в 03:02