我有一个包含英语和西班牙语版本问卷的数据集。调查问卷询问个人是否曾经接受过大量不同的诊断。对于英文数据,每个变量的形式为prev_dx_major_depression
,而对于西班牙文数据,则为prev_dx_major_depression_span
。
我想把两者合并成一个变量。我目前正在使用以下代码来实现此目的:
mutate(
prev_dx_major_depression = if_else(prev_dx_major_depression == 1 |
prev_dx_major_depression_span == 1,
1, 0
))
然而,我知道对于如此大量的变量来说,这是非常低效的。我的直觉是,我需要使用mutate_at
、recode
、starts_with
和ends_with
的一些组合。然而,我有点拘泥于此,不确定如何将相应的变量匹配在一起。
以下是一些示例数据:
sample_data <-
structure(
list(
id = 1:5,
prev_dx_major_depression = c(0, 1, 1,
0, 0),
prev_dx_bipolar = c(0, 0, 0, 0, 0),
prev_dx_generalized_anxiety = c(1,
1, 0, 0, 0),
prev_dx_major_depression_span = c(NA, NA, NA, NA,
1),
prev_dx_bipolar_span = c(NA, NA, NA, NA, NA),
prev_dx_generalized_anxiety_span = c(NA,
NA, NA, NA, 1)
),
class = "data.frame",
row.names = c(NA,-5L)
)
一个选项是
- 重命名变量以在英文数据列中添加后缀
engl
- 转换为长格式,这样我们最终会得到一列包含变量名的列和两列西班牙语和英语数据
- 获取每个变量的唯一值
- 转换回宽格式
library(dplyr)
library(tidyr)
rename_with(sample_data, ~ paste0(.x, "_engl"), .cols = !c(ends_with("_span"), id)) %>%
pivot_longer(-id, names_to = c("var", ".value"), names_pattern = "^(.*)_(.*)$") %>%
mutate(value = if_else(span %in% 1 | engl %in% 1, 1, 0)) %>%
select(-engl, -span) %>%
pivot_wider(names_from = var, values_from = value)
#> # A tibble: 5 × 4
#> id prev_dx_major_depression prev_dx_bipolar prev_dx_generalized_anxiety
#> <int> <dbl> <dbl> <dbl>
#> 1 1 0 0 1
#> 2 2 1 0 1
#> 3 3 1 0 0
#> 4 4 0 0 0
#> 5 5 1 0 1