【问题标题】:R: Convert values into pipe-delimited formatR:将值转换为管道分隔格式
【发布时间】:2018-11-29 16:27:57
【问题描述】:

我正在尝试从 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。

【问题讨论】:

    标签: r database dictionary data-manipulation redcap


    【解决方案1】:

    这是一种依赖于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
    )
    

    第二步:从单列中提取隐含结构

    • 正则表达式识别和分隔列。 (如果您从文件中读取,最初的 \\s*? 可能会被删除。)。
    • Variable 中的空白将替换为 NAs。
    • 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
    

    第三步:确定并记录Variable的初始顺序

    ds_order <- ds_completed %>% 
      dplyr::distinct(Variable) %>% 
      tibble::rowid_to_column("variable_order")
    

    第4步:每个唯一Variable输出一行

    • 折叠Values,用管道隔开。
    • 通过加入ds_orderarrange()ing 恢复Variable 订单。
    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 目前不是其中之一。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-06-12
      • 2010-11-24
      • 2019-03-18
      • 1970-01-01
      • 2014-10-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多