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 не является одним из них.

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