R: преобразовать значения в формат с разделителями
Я пытаюсь создать словарь данных RedCap из вывода SPSS. SPSS перечисляет допустимые значения или факторы для каждой переменной следующим образом:
SEX 0 Male
1 Female
LANGUAGE 1 English
2 Spanish
3 Other
6 Unknown
Как я могу преобразовать вышеупомянутое в этот формат для RedCap:
Variable Values
SEX 0, Male | 1, Female
LANGUAGE 1, English | 2, Spanish | 3, Other | 6, Unknown
Язык, с которым я лучше всего знаю R. Заранее спасибо!
1 ответ
Вот один подход, который опирается на sub()
а также tidyr::fill()
, Он возвращает набор данных, который вы можете записать на диск (с чем-то вроде readr::write_csv()
или вставьте из консоли R непосредственно в словарь данных REDCap.
Шаг 1: читать текст в виде набора данных из одного столбца.
С вашим сценарием, raw_text
может быть путь к файлу.
raw_text <- "
SEX 0 Male
1 Female
LANGUAGE 1 English
2 Spanish
3 Other
6 Unknown"
ds_raw <- readr::read_csv(
file = raw_text,
col_names = FALSE,
trim_ws = FALSE
)
Шаг 2: извлечь подразумеваемую структуру из одного столбца
- регулярные выражения определяют и разделяют столбцы. (Начальный
\\s*?
может быть отброшен, если вы читаете из файла.) - пробелы в
Variable
заменены наNA
s. ID
а такжеValue
задушены, чтобы создатьValues
,tidyr::fill()
переносит пропавших без вестиVariable
клетки.
library(magrittr)
pattern <- "^\\s*?(\\w+)?\\s+(\\d{1,3})\\s+(.+?)$"
ds_completed <- ds_raw %>%
dplyr::mutate(
Variable = sub(pattern, "\\1", X1),
ID = as.integer(sub(pattern, "\\2", X1)),
Value = sub(pattern, "\\3", X1),
Variable = dplyr::na_if(Variable, ""),
Values = paste0(ID, ", ", Value)
) %>%
tidyr::fill(Variable) %>%
dplyr::select(-X1)
Промежуточный результат:
# A tibble: 6 x 4
Variable ID Value Values
<chr> <int> <chr> <chr>
1 SEX 0 Male 0, Male
2 SEX 1 Female 1, Female
3 LANGUAGE 1 English 1, English
4 LANGUAGE 2 Spanish 2, Spanish
5 LANGUAGE 3 Other 3, Other
6 LANGUAGE 6 Unknown 6, Unknown
Шаг 3: определите и запишите начальный порядок Variable
ds_order <- ds_completed %>%
dplyr::distinct(Variable) %>%
tibble::rowid_to_column("variable_order")
Шаг 4: вывести одну строку на уникальный Variable
- коллапс
Values
, разделенные трубой. - восстановить
Variable
заказать, присоединившись кds_order
а такжеarrange()
ING.
ds_completed %>%
dplyr::group_by(Variable) %>%
dplyr::summarize(
Values = paste(Values, collapse = " | ")
) %>%
dplyr::ungroup() %>%
dplyr::left_join(ds_order, by="Variable") %>%
dplyr::arrange(variable_order) %>%
dplyr::select(-variable_order)
Результат
# A tibble: 2 x 2
Variable Values
<chr> <chr>
1 SEX 0, Male | 1, Female
2 LANGUAGE 1, English | 2, Spanish | 3, Other | 6, Unknown
Формализация в функции пакета.
Мне никогда не приходилось переходить из формата SPSS в словарь данных REDCap, но здесь есть смысл. Если это часто требуется пользователям SPSS (которые немного знают R), я хочу переместить эту функцию в REDCapR и написать модульные тесты, если вы создадите новую проблему и сохраните несколько примеров входных наборов данных и ожидаемых наборов данных (для юнит тесты).
Если вам когда-нибудь понадобится перевести в обратном направлении, подумайте REDCapR::checkbox_choices()
,
Другие источники
REDCapR и redcapAPI - это два пакета R, разработанные на основе REDCap API. Для API REDCap написано около десятка пакетов на разных языках, но в настоящее время SPSS не является одним из них.