Назначение переменной в цикле for

r variable-assignment

40905 просмотра

1 ответ

619 Репутация автора

Возможный Дубликат:
R: Как преобразовать строку в имя переменной?

В R я пишу цикл for, который будет итеративно создавать имена переменных, а затем присваивать значения каждой переменной.

Вот упрощенная версия. Намерение состоит в том, чтобы создать имя переменной на основе значения итерационной переменной i, а затем заполнить новую переменную значениями NA.

(Я только повторяю 1: 1 ниже, так как проблема возникает не в самом цикле, а в том, как переменная создается и присваивается.)

for (i in 1:1) {

    #name variable i "Variablei"
    varName = paste("Variable", as.character(i), sep="")

    #fill variable with NA values
    varName = rep(NA, 12)

    print(varName)
    print(Variable1)
}

Теперь varName распечатывается как

 [1] NA NA NA NA NA NA NA NA NA NA NA NA

и переменная1 не найдена.

Я понимаю на каком-то уровне, почему это глючит. В первой строке varName становится вектором, единственной записью которого является строка «Variable1». Затем varName переназначается для хранения значений NA. Поэтому, когда я пытаюсь напечатать Variable1, его не существует.

Я думаю, что более общая проблема - это назначение или равенство. В первой строке я хочу, чтобы varName было равно вновь созданной строке, но в следующей строке я хочу, чтобы varName был назначен вектору значений NA.

Какой самый простой способ создать это различие? Я также открыт для совершенно других, лучших способов сделать это.

РЕДАКТИРОВАТЬ: изменил название, потому что я неправильно охарактеризовал проблему.

Автор: half-pass Источник Размещён: 03.11.2012 09:50

Ответы (1)


12 плюса

5113 Репутация автора

Решение

Назначение работает так:

<varname> = <expression>

или более традиционно

<varname> <- <expression>

Таким образом, в вашем коде вы только когда-либо назначены varName. Речь идет не о назначении против равенства, а о назначении. Вы можете посмотреть на assign:

for (i in 1:5) {
  assign(paste0("Variable", i), 10*i)
} 

как игрушечный пример.

Более того, как отмечается в комментариях, вероятно, есть более подходящие подходы для вашего приложения. Например, почему бы не просто использовать вектор myvectorи вместо того , чтобы переменные называются Variable1, Variable2и т.д. Вы можете обратиться к myvector[1], и myvector[2]т.д.

В качестве примера, скажем, вы планировали работать с

Variable1 <- 'foo'
Variable2 <- 'bar'
Variable3 <- 'baz'

Затем вы можете изменить свой подход и установить

mydata <- c('foo', 'bar', 'baz')

и где вы ранее использовали Variable2(что содержит 'bar') вы используете вместо mydata[2](который также содержит 'bar'). Дело в том, что работать с векторами и фреймами данных в R намного проще, чем с длинным списком переменных.

Вы можете пойти дальше и назвать записи:

names(mydata) <- paste0("V", 1:3)

который затем позволяет писать mydata["V2"]для извлечения bar.

Автор: seancarmody Размещён: 03.11.2012 09:56
Вопросы из категории :
32x32