【发布时间】:2021-11-09 04:22:50
【问题描述】:
正在努力寻找一个优雅的解决方案...
我对“请选择所有适用的”问题做出了回应,其中每个问题的选项 A 到 F 都被编码为二进制变量。因此,例如,下面假数据集中的第一响应者只为问题 1 打勾 D,然后为问题 2 打勾 A、C、D 和 E。
library(dplyr)
cols <- paste0('foo', '_', c(1:2, '3a', '3b')) %>%
lapply(\(i) paste0(i, '_', LETTERS[1:6])) %>%
unlist()
set.seed(1)
df <- lapply(cols, \(i) i = sample(0:1, 5, replace = TRUE)) %>%
setNames(cols) %>%
data.frame()
'data.frame': 5 obs. of 24 variables:
$ foo_1_A : int 0 1 0 0 1
$ foo_1_B : int 0 0 0 1 1
$ foo_1_C : int 0 0 0 0 0
$ foo_1_D : int 1 1 1 1 0
$ foo_1_E : int 0 0 0 0 0
$ foo_1_F : int 0 1 0 0 1
$ foo_2_A : int 1 1 0 1 0
$ foo_2_B : int 0 1 0 1 1
$ foo_2_C : int 1 1 0 1 1
$ foo_2_D : int 1 1 1 0 0
$ foo_2_E : int 1 0 1 1 0
$ foo_2_F : int 0 1 1 1 0
$ foo_3a_A: int 0 1 1 1 1
$ foo_3a_B: int 1 1 0 1 1
$ foo_3a_C: int 1 1 0 0 0
$ foo_3a_D: int 1 1 0 0 1
$ foo_3a_E: int 1 1 0 0 0
$ foo_3a_F: int 1 0 1 0 1
$ foo_3b_A: int 0 0 1 1 0
$ foo_3b_B: int 0 0 1 1 0
$ foo_3b_C: int 1 1 1 0 0
$ foo_3b_D: int 0 0 1 0 0
$ foo_3b_E: int 0 0 0 1 1
$ foo_3b_F: int 1 1 0 1 1
我想要将1 重新编码为每列的选择字母(A、B、C、D、E 或 F)并将选择连接为每个问题,以便我有这样的事情:
foo_1 D ADF D BD ABF
foo_2 ACDE ABCDF DEF ABCEF BC
foo_3a BCDEF ABCDE AF AB ABDF
foo_3b CF CF ABCD ABEF EF
这是我在意识到我会一遍又一遍地重复类似代码之前得到的:
df <- df %>% mutate(across(
starts_with('foo') & ends_with('A'),
~ recode(., `1` = 'A', .default = NA_character_)
))
【问题讨论】:
-
对于重新编码步骤,我会使用这个:
df %>% mutate(across(everything(), ~ifelse(.x==1, str_extract(deparse(substitute(.x)), "[A-Z]$"), NA)))。不太清楚如何从那里去
标签: r multiple-columns dplyr