繁体   English   中英

如何在 r 中使用多重响应组合重新编码分类变量?

[英]How to recode categorical variable with multiple response combinations in r?

我是堆栈溢出的新手,找不到我的问题的答案。 我真的很感激任何输入!

我有一个正在整理的数据集。 我想将具有 202 列的变量重新编码为具有二进制值的表。 它来自“选中所有适用项”调查。 调查中的 output 如下所示:

Participant          Language
 1                   'English|French'
 2                   'English'
 3                   'Spanish|French'
 4                   'English|Spanish'
 5                   'French'

变量 output 的语言由“|”分隔所以不能在这里做一张桌子。 我希望结果看起来像这样:

参与者 英语 法语 西班牙语
1个 1个 1个 0
2个 1个 0 0
3个 0 1个 1个
4个 1个 0 1个
5个 0 1个 0

我不确定如何在不使用 '''ifelse''' 并为每种可能的语言组合创建 '''or''' arguments 的情况下执行此操作。 我真的很感激任何提示!

注意:实际数据集不关注语言,但格式相同。 有超过 3 种选择,所以我希望找到一种有效的方法来做到这一点

使用tidyverse ,您可以尝试以下操作。 使用separate_rows您可以为每种语言添加行。 然后,添加一个临时列以指示 1 何时为参与者提供语言。 最后, pivot_wider会将结果放入所需的格式。

library(tidyverse)

df %>%
  separate_rows(Language) %>%
  mutate(Present = 1) %>%
  pivot_wider(id_cols = Participant, 
              names_from = Language, 
              values_from = Present,
              values_fill = 0)

Output

  Participant English French Spanish
        <int>   <dbl>  <dbl>   <dbl>
1           1       1      1       0
2           2       1      0       0
3           3       0      1       1
4           4       1      0       1
5           5       0      1       0

您需要先定义所需的列。 您可以手动执行此操作:

cols <- c("English", "French", "Spanish")

或自动化:

cols <- unique(unlist(strsplit(df$Language, "\\|")))

cols
#> [1] "English" "French"  "Spanish"

在任何一种情况下,您的结果都可以这样获得:

cbind(df[1], setNames(as.data.frame(lapply(cols, function(x) {
  as.numeric(grepl(x, df$Language))
})), cols))
#>   Participant English French Spanish
#> 1           1       1      1       0
#> 2           2       1      0       0
#> 3           3       0      1       1
#> 4           4       1      0       1
#> 5           5       0      1       0

reprex package (v2.0.1) 创建于 2022-03-13


数据

df <- structure(list(Participant = 1:5, Language = c("English|French", 
"English", "Spanish|French", "English|Spanish", "French")), 
class = "data.frame", row.names = c(NA, -5L))

df
#>   Participant        Language
#> 1           1  English|French
#> 2           2         English
#> 3           3  Spanish|French
#> 4           4 English|Spanish
#> 5           5          French

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM