R:将值转换为竖线分隔格式
R: Convert values into pipe-delimited format
我正在尝试从 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。
这是一种依赖于 sub()
and tidyr::fill()
. It returns a dataset that you may want to write to disk (with something like readr::write_csv()
or paste from the R console directly into the 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
替换。
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
,用竖线隔开
- 通过加入
ds_order
和 arrange()
来恢复 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()
。
其他资源
REDCapR and redcapAPI是开发的两个R包
围绕 REDCap API。大概有十几个packages written in various languages for the REDCap API,
但 SPSS 目前不是其中之一。
我正在尝试从 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。
这是一种依赖于 sub()
and tidyr::fill()
. It returns a dataset that you may want to write to disk (with something like readr::write_csv()
or paste from the R console directly into the 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
替换。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
,用竖线隔开 - 通过加入
ds_order
和arrange()
来恢复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()
。
其他资源
REDCapR and redcapAPI是开发的两个R包 围绕 REDCap API。大概有十几个packages written in various languages for the REDCap API, 但 SPSS 目前不是其中之一。