R:将值转换为管道分隔格式

时间:2018-06-20 13:51:16

标签: r database dictionary data-manipulation

我正在尝试从SPSS输出创建RedCap数据字典。 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 个答案:

答案 0 :(得分:0)

这是一种依靠sub()tidyr::fill()的方法。它会返回您可能要写入磁盘的数据集(使用类似readr::write_csv()或从R控制台直接粘贴到REDCap data dictionary中的数据集。

步骤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取代。
  • IDValue被伪装成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,用管道分隔。
  • 通过加入Variableds_order来恢复arrange()的顺序。
  
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函数 并编写单元测试,以创建new issue 并保存一些示例输入数据集和预期数据集(用于单元测试)。

如果您需要以相反的方向进行翻译,请考虑使用REDCapR::checkbox_choices()

其他资源

REDCapRredcapAPI是开发的两个R包 围绕REDCap API。大约有一打packages written in various languages for the REDCap API, 但是SPSS目前不是其中之一。