Зацикливание на векторах (НЕ зацикливание на элементах вектора) - PullRequest
0 голосов
/ 14 июня 2019

собратьев-накопителей

У меня сейчас, скажем, 2 вектора

x <- 1:2
y <- 3:4

Я хочу сделать что-то вроде

for (i in c("x","y"))
{
  i <- data.frame(i)
  i$flag <- ifelse(i == "x", 1, 0)  # just a flagging field
}

Я, очевидно, имею в виду хи у неправильно.Однако я не уверен, как еще это сделать.Любая помощь приветствуется.Спасибо.

Ответы [ 2 ]

4 голосов
/ 14 июня 2019

Если я вас правильно понимаю, и вы хотите перебрать все векторы вместо векторных элементов, вы можете поместить свои векторы в список, а затем перебрать список.

Примерно так:

x <- c(1:10)
y <- c(11:20)

for (item in list(x, y)) {
    # your code
}

Редактировать (после уточнения):

Если вы хотите превратить оба вектора в data.frames, это одинаково просто.Во-первых, поместите оба вектора в список, затем измените их в цикле:

x <- c(1:10)
y <- c(11:20)
list_of_vectors <- list(x, y)

for (i in seq_along(list_of_vectors)) {
    list_of_vectors[[i]] <- as.data.frame(list_of_vectors[[i]])
}

Однако более подходящим решением будет использование lapply:

x <- c(1:10)
y <- c(11:20)
list_of_vectors <- list(x, y)
list_of_vectors <- lapply(list_of_vectors, as.data.frame)
1 голос
/ 15 июня 2019

Вы можете использовать Map и передавать x и y в качестве list аргумента, а символы "x" и "y" в качестве другого аргумента. Это даст вам список из двух отдельных фреймов данных

Map(function(x, y) data.frame(x, y = as.integer(y == "x")), list(x, y), c("x", "y"))

#[[1]]
#  x y
#1 1 1
#2 2 1

#[[2]]
#  x y
#1 3 0
#2 4 0

Или, может быть, только с lapply

lst <- list(x = x, y = y)
lapply(seq_along(lst), function(x) 
       data.frame(x = lst[[x]], y = as.integer(names(lst)[x] == "x")))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...