Як називати змінні на льоту?


96

Чи можна створювати нові імена змінних на льоту?

Я хотів би прочитати кадри даних зі списку у нові змінні з цифрами в кінці. Щось на зразок orca1, orca2, orca3 ...

Якщо я спробую щось на зразок

paste("orca",i,sep="")=list_name[[i]]

Я отримую цю помилку

target of assignment expands to non-language object

Чи є інший спосіб обійти це?


10
Поки ми видаємо теги r-faq, давайте посилання (FAQ 7.21: cran.r-project.org/doc/FAQ/… )
Бен Болкер

Відповіді:


118

Використання assign:

assign(paste("orca", i, sep = ""), list_name[[i]])

28
Ось як це зробити. Тут є мета-запитання: "Чи варто це робити?" Відповідь майже завжди "ні". Іменовані елементи у списку майже завжди є кращими.
Арі Б. Фрідман,

26
Відповідь майже завжди "ні", крім випадків, коли це не так.
Шейн

9
Ну звичайно. Але більшість людей, які шукають цю відповідь, роблять це не з позиції відхилення списку своєї заявки.
Арі Б. Фрідман,

@Ari B. Friedman Я створюю імена змінних для наборів даних, які я зберігаю у своєму пакеті / даних. Кожен у своєму файлі з однаковим іменем для файлу та даних у ньому (надано R рекомендацій щодо даних у пакеті). Кожен набір даних становить близько 10 мільйонів, а загальна сума - ~ 17, інакше я навряд чи бачу інший шлях
cmbarbu

3
Чи є якась причина, чому ви не використовували paste0?
BroVic

33

Мені здається , що ви могли б бути краще зі списком , а не використовувати orca1, orca2і т.д., ... то це було б orca[1], orca[2]...

Зазвичай ви складаєте список змінних, диференційованих нічим, крім числа, оскільки це число буде зручним способом отримати доступ до них пізніше.

orca <- list()
orca[1] <- "Hi"
orca[2] <- 59

В іншому випадку assignце саме те, що ви хочете.


11
Я згоден. Зазвичай, коли люди думають, що хочуть називати змінні на льоту, те, що вони насправді хочуть, - це інша структура даних.
Michael Dunn,

9
+1 (FAQ 7.21: cran.r-project.org/doc/FAQ/… ) це красиво обговорює
Бен Болкер

11

Не робіть кадри даних. Зберігайте список, називайте його елементи, але не додайте його.

Найбільша причина цього полягає в тому, що якщо ви робите змінні в дорозі, майже завжди вам пізніше доведеться перебирати кожну з них, щоб виконати щось корисне. Там вас знову змусять переглядати кожне з імен, які ви створили на льоту.

Набагато легше називати елементи списку та переглядати імена.

Що стосується Attach, його дуже погана практика програмування на R і може призвести до багатьох проблем, якщо ви не будете обережні.


Отже, зробіть вкладення, але лише після того, як зробили ітерацію по списку?
Mox

4

FAQ відповідає:

Якщо у вас є

varname <- c("a", "b", "d")

Ви можете зробити

get(varname[1]) + 2

для

a + 2

або

assign(varname[1], 2 + 2)

для

a <- 2 + 2

Таким чином, виглядає так, що ви використовуєте GET, коли хочете обчислити формулу, яка використовує змінну (наприклад, конкатенат), і ASSIGN, коли ви хочете призначити значення попередньо оголошеній змінній.

Синтаксис для assign: assign (x, value)

x: ім'я змінної, подане як рядок символів. Примус не виконується, і буде використаний перший елемент символьного вектора довжиною більше одиниці із попередженням.

значення: значення, яке слід присвоїти x.


0

Ще одне складне рішення - назвати елементи списку та attachйого:

list_name = list(
    head(iris),
    head(swiss),
    head(airquality)
    )

names(list_name) <- paste("orca", seq_along(list_name), sep="")
attach(list_name)

orca1
#   Sepal.Length Sepal.Width Petal.Length Petal.Width Species
# 1          5.1         3.5          1.4         0.2  setosa
# 2          4.9         3.0          1.4         0.2  setosa
# 3          4.7         3.2          1.3         0.2  setosa
# 4          4.6         3.1          1.5         0.2  setosa
# 5          5.0         3.6          1.4         0.2  setosa
# 6          5.4         3.9          1.7         0.4  setosa

14
хитро, але не мудро. якщо відповідь така, attachти, як правило, ставиш неправильне питання ...
Бен Болкер

-1

А цей варіант?

list_name<-list()
for(i in 1:100){
    paste("orca",i,sep="")->list_name[[i]]
}

Це прекрасно працює. У наведеному прикладі перший рядок відсутній, а потім видає повідомлення про помилку.


3
Це не стосується питання ОП. У нас є список із фреймами даних, і ми хочемо призначити його фреймам даних, які називаються orca1, orca2 тощо
zx8754,

"List with dataframes" = "список OF фреймів даних"?
Mox
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.