Как я могу использовать assign для изменения переменных в кадре данных в R? - PullRequest
1 голос
/ 20 сентября 2010

Я пытался сделать что-то вроде этого:

x <- data.frame(1:20)  
attach(x)  
assign("x2",1:20,pos="x")  

Однако x$x2 дает мне NULL.
С x2 я получаю то, что хочу, но это не частьdata.frame.

Присоединение x2 к x вручную будет работать в этом простом случае, но не в более сложном, который мне нужен.Я пытаюсь assign в цикле, где я зацикливаюсь на именах переменных, используемых в вызове assign.

Ответы [ 3 ]

5 голосов
/ 20 сентября 2010

Попробуйте использовать в пределах:

x <- data.frame(x=1:20)
x <- within(x, {
  x2 <- x^2
  assign('x3', x2 * 2)
  # ... other assignments
})

Можно использовать $ и [[ чище, хотя, что также дает право на порядок столбцов:

x <- data.frame(x=1:20)
x$x2 <- x$x^2
x[['x3']] <- x$x2 * 2
4 голосов
/ 21 сентября 2010

Есть много способов присвоить переменную и т. Д., И лучший из них будет зависеть от личного вкуса.Тем не менее, пара моментов:

Вы не хотите быть attach() ничего.Он будет хорошо работать 9 раз из 10, а затем кусает вас в задницу, когда вы этого не ожидаете, потому что все, что вы делаете, это помещаете копию вашего объекта в путь поиска.Измените исходный объект, и объект в пути поиска не изменится для соответствия.

Лично мне не нравится доступ к вещам с $ в общем использовании.Это уродливо и порождает у пользователей тенденцию просто копаться в объектах и ​​вырывать вещи по своему усмотрению.Не имеет большого значения для ваших данных, но когда я вижу, что люди делают model$residuals, я волнуюсь.Есть лучшие способы (в данном случае resid()).Некоторые пользователи также загадывают формулы своих моделей с помощью $.

Если вы пишете сценарии для анализа данных, к которым вы можете вернуться спустя месяцы или годы, то все, что может помочь вам понять, что делает ваш код, таково:бесценный бонус на мой взгляд.Я нахожу with() и within() полезными для той проблемы, с которой вы столкнулись, потому что они явно о том, что вы хотите сделать.

Это яснее:

x <- data.frame(X = rnorm(10))
with(x, mean(X))
x <- within(x, Y <- rpois(10, 3))

, чем

x <- data.frame(X = rnorm(10))
mean(x$X)
x$Y <- rpois(10, 3)
## or
x["Y"] <- rpois(10, 3)

Даже если они делают одно и то же.

assign() внутри within() вызова - это просто трата текста, не так ли?

4 голосов
/ 20 сентября 2010

В разделе Подробности в ?assign рассказывается, почему ваш код ведет себя так, как он.

Почему бы не нечто простое, например:

x["x2"] <- 1:20
...