#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