这是一种依赖于sub()
and的方法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
第三步:确定并记录初始顺序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::checkbox_choices()
.
其他资源
REDCapR和redcapAPI是围绕 REDCap API 开发的两个 R 包。REDCap API大约有十几个用各种语言编写的包,但 SPSS 目前不是其中之一。