Как использовать элемент вектора символов R как строку и переменную внутри функции?

Я пытаюсь применить метки категорий в стиле SPSS к моему набору данных в R. Я думаю, что мой вопрос возникает из-за того, что я не знаю, как правильно анализировать переменные, поэтому он не обязательно связан только с этими типами данных. Начнем с того, что делать это вручную в соответствии с документацией библиотеки expss отлично работает:

library(expss)

#Load in the data
data(mtcars)

#Apply Variable Labels and Value Labels (and Numeric Coding) to each Variable.
mtcars = apply_labels(mtcars,
                      vs = "Engine",
                      vs = c("V-engine" = 1,
                             "Straight engine" = 2,
                             "Other engine" = 3)
)

Теперь моя проблема возникает, если у меня есть «Имена переменных», «Метки переменных», «Метки значений» и соответствующие «Числовые коды значений», хранящиеся в некотором типе данных R, и я пытаюсь использовать их в функции apply_labels. Например, если я храню их в символьных векторах так:

#Load in the data
data(mtcars)

#Value Labels
value_lab<-c("V-engine","Straight engine","Other engine")
#Value's Numeric coding
value_num<-c("1","2","3")

#Variable names
var <- c("vs")
#Variable Labels
var_lab<-c("Engine")

Тогда мой вопрос: как мне использовать элементы вектора символов внутри функции apply_labels? например как бы я сделал что-то вроде этого:

#Apply Variable Labels and Value Labels (and Numeric Coding) to each Variable.
mtcars = apply_labels(mtcars,
                      var[1] = var_lab[1],
                      var[1] = c(value_lab[1] = value_num[1],
                                 value_lab[2] = value_num[2],
                                 value_lab[3] = value_num[3])
)

Я пробовал различные комбинации paste и toString безуспешно. Мой следующий шаг будет заключаться в том, чтобы применить это к моим 500 000+ строк x 20 000 столбцов данных с количеством возможных меток значений/числовых кодов, которые необходимо определить. Обязательно: я новичок в R. Спасибо.

Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
3
0
733
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Для достижения желаемого результата

  1. Используйте именованные списки и векторы для хранения меток переменных и значений.
  2. При этом вы можете использовать do.call для передачи меток переменных и значений в apply_labels

Чтобы сделать пример более интересным, я добавил метки для второй переменной.

library(expss)

# Variable Labels
var_labels <- list(vs = "Engine", am = "Transmission")
#Value Labels
val_labels <- list(
  vs = c("V-engine" = 0, "Straight engine" = 1),
  am = c("Automatic" = 0, "Manual" = 1)
)

mtcars2 <- do.call(apply_labels, c(list(data = mtcars), var_labels, val_labels))

table(mtcars2$am, mtcars2$vs)
#>            
#>             V-engine Straight engine
#>   Automatic       12               7
#>   Manual           6               7

Отлично, спасибо! Это привело меня к пониманию именованных списков и созданию решения с помощью setNames.

В итоге я не использовал expss. Оказалось, что он работает в R и помечает все, как ожидалось, но когда я экспортировал окончательный фрейм данных из R в SPSS с помощью haven::write_sav, метки значений не сохранялись (но метки переменных сохранялись).

Вместо этого я использовал векторный класс с меткой haven, чтобы применить метки Variable и Value. Мое окончательное решение выглядит так:

#Load in the data
data(mtcars)

#Variables
var <- c("vs")
#Variable Labels
var_labels<-c("Engine")

#Value Labels (for first Variable)
value_labs<-c("V-engine","Straight engine","Other engine")
#Value's Numeric coding )
value_num<-c("1","2","3")

#Make a named list to use as the value labels
value_labels <- setNames(as.integer(value_num),value_labs)

#Apply the label with haven
mtcars[,c(var[1])]<-labelled(mtcars[, c(var[1])],
                              labels=value_labels,
                              label=var_labels[1])

#Save out in spss format
haven::write_sav(mtcars, "test.sav")

Кроме того, я настроил его так, чтобы мои данные поступали в одну группу меток значений за раз, но ваш пример расширения до второй переменной помог мне обобщить и это, так что еще раз спасибо!

Другие вопросы по теме