Усекать уровни фрейма данных — tidyverse (stringr, haven)

#r #tidyverse #stringr

#r #tidyverse #stringr

Вопрос:

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

Дело в том, что SPSS допускает только переменные уровни, которые короче 120 символов. У меня есть переменные уровни, которые превышают этот предел, что не позволяет мне записать *.sav файл с фреймом данных.

Итак, моя идея состояла в том, чтобы усекать каждый возникающий уровень каждого столбца фрейма данных до <= 120 символов, чтобы убедиться, что процесс записи не прерывается, но я не могу понять, как управлять всеми уровнями из всех столбцов.

Я извлекаю уровни следующим образом:

 df %>%
    lapply(levels)
  

Но после этого я просто теряюсь, как обращаться со списком, который я получаю взамен, тем более, что большинство элементов этого списка просто не имеют никаких уровней (и присваиваются NULL с помощью lapply).

Я пробовал что-то подобное, но после этого haven::write_sav() записывает только «1» вместо фактического значения для каждой переменной в электронную таблицу SPSS:

 df <- df %>%
          as.matrix()    %>%
          str_trunc(120) %>%
          as.data.frame()

haven::write_sav(df, "test.sav")
  

Я ищу решение этой проблемы, если это возможно, и любая помощь высоко ценится!

Комментарии:

1. возможно, df %>% mutate_all(strtrim, width = n) где n <- 120 . Что касается проблемы с записью, 1 возможно, это из-за factor столбцов. Попробуйте с %>% as.data.frame(., stringsAsFactors = FALSE)

2. Работает просто великолепно! Кроме того, этот способ также, по-видимому, устраняет проблему простой записи 1 в выходной файл. Спасибо!

Ответ №1:

Мы можем использовать strtrim ( base R ), применяемый ко всем столбцам ( mutate_all )

 library(dplyr)
n <- 120
df %>%
   mutate_all(strtrim, width = n)
  

В исходном коде OP as.data.frame преобразует его в a, data.frame с character столбцами по умолчанию ( stringsAsFactors = TRUE ) являются factor s, если это не указано с помощью stringsAsFactors = FALSE