Добавление атрибутов `@` в фрейм данных R Haven SPSS

Я пытаюсь воссоздать вывод загрузки файла сохранения SPSS с помощью haven, у которого есть атрибуты, прикрепленные к каждому столбцу, например:

> class(PISA_teacher)
[1] "tbl_df"     "tbl"        "data.frame"

Мой код таков:

df <- list(c(1,2,3,4), c("c","d","e","a")) %>% as.data.frame()
names(df) <- c("CNTRYID","Grade")
attr(df$CNTRYID, "label") <- c("Country Identifier")

Но это дает мне другой атрибут, без @:

Как я могу получить что-то похожее на вывод SPSS sav?

Вывод кадра данных PISA_teacher выглядит следующим образом:

structure(list(CNTRYID = structure(c(36, 36, 36), label = "Country Identifier", format.spss = "F3.0", labels = c(Albania = 8, Algeria = 12, Argentina = 32, Australia = 36, Austria = 40, Belgium = 56, Brazil = 76, Bulgaria = 100, Canada = 124, Chile = 152, `Chinese Taipei` = 158, Colombia = 170, `Costa Rica` = 188, Croatia = 191, Cyprus = 196, `Czech Republic` = 203, Denmark = 208, `Dominican Republic` = 214, Estonia = 233, Finland = 246, France = 250, Georgia = 268, Germany = 276, Greece = 300, `Hong Kong` = 344, Hungary = 348, Iceland = 352, Indonesia = 360, Ireland = 372, Israel = 376, Italy = 380, Japan = 392, Kazakhstan = 398, Jordan = 400, Korea = 410, Kosovo = 411, Lebanon = 422, Latvia = 428, Lithuania = 440, Luxembourg = 442, Macao = 446, Malaysia = 458, Malta = 470, Mexico = 484, Moldova = 498, Montenegro = 499, Netherlands = 528, `New Zealand` = 554, Norway = 578, Peru = 604, Poland = 616, Portugal = 620, `Puerto Rico (USA)` = 630, Qatar = 634, Romania = 642, `Russian Federation` = 643, Singapore = 702, `Slovak Republic` = 703, Vietnam = 704, Slovenia = 705, Spain = 724, `Spain (Regions)` = 725, Sweden = 752, Switzerland = 756, Thailand = 764, `Trinidad and Tobago` = 780, `United Arab Emirates` = 784, Tunisia = 788, Turkey = 792, FYROM = 807, `United Kingdom` = 826, `United Kingdom - excl. Scotland` = 827, Scotland = 828, `United States` = 840, Uruguay = 858, `B-S-J-G (China)` = 970, `Spain (Regions)` = 971, `USA (Massachusetts)` = 972, `USA (North Carolina)` = 973, `Argentina (Ciudad Autónoma de Buenos)` = 974), class = c("haven_labelled", "vctrs_vctr", "double")), CNT = structure(c("AUS", "AUS", "AUS"), label = "Country code 3-character", format.spss = "A3", display_width = 3L, labels = c(Moldova = "MDA", Thailand = "THA", Brazil = "BRA", France = "FRA", `United States` = "USA", Italy = "ITA", Latvia = "LVA", Algeria = "DZA", Albania = "ALB", Macao = "MAC", Greece = "GRC", Scotland = "QSC", `Massachusettes (USA)` = "QUC", FYROM = "MKD", Netherlands = "NLD", `Puerto Rico (USA)` = "QUD", Switzerland = "CHE", Montenegro = "MNE", `United Arab Emirates` = "ARE", `North Carolina (USA)` = "QUE", Sweden = "SWE", `Czech Republic` = "CZE", `Hong Kong` = "HKG", Argentina = "ARG", `B-S-J-G (China)` = "QCH", `Costa Rica` = "CRI", Denmark = "DNK", `United Kingdom - excl. Scotland` = "QUK", `Slovak Republic` = "SVK", Belgium = "BEL", `Belgium (Flemish)` = "BFL", Chile = "CHL", Colombia = "COL", Poland = "POL", Ireland = "IRL", Iceland = "ISL", `New Zealand` = "NZL", Vietnam = "VNM", `Dominican Republic` = "DOM", Canada = "CAN", Lebanon = "LBN", Indonesia = "IDN", China = "CHN", Finland = "FIN", Japan = "JPN", Hungary = "HUN", Tunisia = "TUN", Slovenia = "SVN", Georgia = "GEO", `Trinidad and Tobago` = "TTO", `Chinese Taipei` = "TAP", Singapore = "SGP", Spain = "ESP", `Argentina (Ciudad Autónoma de Buenos)` = "QAR", `United Kingdom` = "GBR", Peru = "PER", `Belgium (French)` = "BFR", Bulgaria = "BGR", Jordan = "JOR", Korea = "KOR", Norway = "NOR", Israel = "ISR", Turkey = "TUR", `Spain (Regions)` = "QES", Australia = "AUS", `Russian Federation` = "RUS", Malaysia = "MYS", Qatar = "QAT", Malta = "MLT", Portugal = "PRT", Estonia = "EST", Austria = "AUT", Germany = "DEU", Romania = "ROU", Lithuania = "LTU", Croatia = "HRV", Kosovo = "KSV", Mexico = "MEX", Luxembourg = "LUX", Cyprus = "QCY", Uruguay = "URY", Kazakhstan = "KAZ", `International Master` = "ZZZ"), class = c("haven_labelled", "vctrs_vctr", "character"))), row.names = c(NA, -3L), class = c("tbl_df", "tbl", "data.frame"))

ах, так что фрейм данных должен быть помечен как убежище? Являются ли атрибуты @ способом определения атрибутов ООП?

pluke 01.11.2022 17:42

> class(PISA_teacher) [1] "tbl_df" "tbl" "data.frame"

pluke 01.11.2022 17:48

правильно, класс data.frame и класс столбца разные: class(df$CNTRYID) class(df)

pluke 01.11.2022 18:05

Я обновил вывод dput, чтобы иметь более одного столбца, это меняет класс data.frame с разными классами столбцов.

pluke 01.11.2022 18:08

@pluke Вы хотите иметь те же атрибуты в df, что и в PISA_teacher для общих столбцов?

akrun 01.11.2022 18:26

да, у меня есть файлы SPSS, а также файлы txt с соответствующим синтаксисом SPSS, поэтому я пытаюсь вручную создать их, чтобы они соответствовали тому же формату

pluke 01.11.2022 18:31

например attributes(df$CNTRYID) <- attributes(PISA_teacher$CNTRYID) получит те же атрибуты для CNTRYID

akrun 01.11.2022 18:32

Это работает для некоторых столбцов, но другие столбцы уникальны и имеют другие атрибуты (указанные в файлах синтаксиса SPSS).

pluke 01.11.2022 18:34

Не могли бы вы отредактировать свой вопрос, чтобы включить информацию о структуре в виде текста, а не в виде снимка экрана? Вы можете получить это с помощью функции str()...

Ben Bolker 01.11.2022 18:36
Стоит ли изучать 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 называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
9
62
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

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

Используйте haven::labelled (это не даст вам компонент @format.spss, но даст вам все остальное)

library(dplyr)
library(haven)
df <- data.frame(CNTRYID = c(1,2,3,4), Grade = c("c","d","e","a"))
df |>
  mutate(across(CNTRYID, labelled, 
         labels = c("Albania"=1, "Austria"=2, "Zambia"=3, "Zimbabwe"=4), 
  label = "Country Name"))

В документации говорится

Я ожидаю, что вы принудите к стандартному классу R (например, ‘factor()’) вскоре после импорта.

Блестяще, спасибо. Мне нужно подумать о том, как я хочу, чтобы эти файлы выглядели как готовые data.frames. формат убежища SPSS - это что-то вроде скрипки.

pluke 01.11.2022 23:16

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