将多项选择响应转换为单热编码

Converting Multiple choice response to one-hot encoding

提问人:andy 提问时间:11/14/2023 更新时间:11/14/2023 访问量:67

问:

我有一个 excel 文件,其中包含包含具有多项选择答案的问题的数据。例如,这个问题有 15 个多项选择选项。我想将这种格式的响应转置为采用 one-hot 编码格式。最终,这将使我更容易进行分析。

问题

远程学习的最佳方面?

  1. 灵活性
  2. 可及性
  3. 时间范围
  4. 模块质量
  5. 学习资源
  6. 课前课程
  7. 住宅质量
  8. 住宅数量
  9. 教程质量
  10. 教程频率
  11. 指导支持的质量
  12. 指导支持的频率
  13. 该计划的包容性方法使所有性别的学习者受益
  14. 该计划对个人自信和自我提升的影响
  15. 该计划对提高教学技能的影响

如何在 R 中执行此操作?我不擅长 excel,但第二个 excel 替代方案会有所帮助。

r Excel DPLYR

评论

2赞 Limey 11/14/2023
Stack Overflow 不是要求别人为你编写代码的地方,尽管社区非常愿意帮助你解决在自己编写代码时遇到的特定问题。到目前为止,您尝试了什么,为什么没有奏效?
0赞 andy 11/14/2023
我没有起点。我知道如何分析一个热门的编码问题。如果没有解决方案。我可以手动完成。我以为有一条捷径
0赞 Mark 11/14/2023
创建一个较小的版本,其中包含输入和所需的输出。确定是要 excel 答案还是 R 答案
0赞 Ron Rosenfeld 11/14/2023
你可以从对这个问题做一些研究开始。例如,当您尝试应用下面列出的相关问题之一中建议的解决方案时,发生了什么情况?

答:

0赞 hanne 11/14/2023 #1

我会使用以下软件包:fastDummies

# # If necessary, install the package
# install.packages("fastDummies")
 
# Load the library
library(fastDummies)
 
# Using your 'Best Aspect to Distance learning' dataset
data <- name_of_your_dataset
 
# Create dummy variables
data <- dummy_cols(data, 
                   select_columns = "Best Aspect to Distance learning")
 
# Verify
print(data)

评论

0赞 Mark 11/14/2023
这如何回答对不起的问题?
0赞 Mark 11/15/2023
我问是因为我尝试在示例中运行它,但它没有产生所需的输出
2赞 Mark 11/14/2023 #2

根据我在网上看到的热门编码表,您似乎想要这样的东西:

library(tidyverse)

df <- read_csv("/Users/mark/Downloads/Best Aspect to Distance learning - Sheet1.csv")
df |> 
  mutate(row = row_number(),
         `Best Aspect to Distance learning` = str_split(`Best Aspect to Distance learning`, ", |,| and ")) |> 
         unnest(`Best Aspect to Distance learning`) |> 
         pivot_wider(names_from = `Best Aspect to Distance learning`, values_from = `Best Aspect to Distance learning`, values_fn = ~ 1, values_fill = 0) 

输出:

# A tibble: 13 × 19
     row   `1`   `2`   `3`   `4`   `5`   `7`   `8`   `9` others  `10`  `15`
   <int> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>  <dbl> <dbl> <dbl>
 1     1     1     1     1     1     1     1     1     1      1     0     0
 2     2     1     1     1     1     1     1     1     1      0     0     0
 3     3     1     1     1     1     1     1     1     0      0     0     0
 4     4     1     1     1     1     1     0     0     1      0     1     1
 5     5     1     1     1     0     1     0     0     1      0     0     0
 6     6     1     1     1     1     1     0     1     0      0     0     0
 7     7     1     1     0     0     0     1     1     0      0     0     0
 8     8     1     1     1     0     1     0     0     0      0     0     1
 9     9     1     1     1     1     1     1     1     0      0     0     0
10    10     0     1     0     1     0     1     0     0      0     0     0
11    11     0     1     1     0     0     0     1     0      0     0     0
12    12     1     1     0     1     1     1     0     0      0     0     0
13    13     0     1     1     1     0     1     0     1      0     0     0
# ℹ 7 more variables: `11` <dbl>, `35` <dbl>, `13` <dbl>, `16` <dbl>,
#   `6` <dbl>, `12` <dbl>, `14` <dbl>

您可能希望包含从最小值到最大值的所有数字的列,甚至包括每个值都为零的列,但您没有提到这一点。如果这是你想要的,请告诉我。期望的输出会很棒。

评论

0赞 andy 11/15/2023
嗨,马克,这是所需的输出。但是,我不明白,你说的是什么意思......“您可能希望包含从最小到最大的所有数字的列”......如果建议的列是 18,根据多项选择选项的计数,这是否意味着 min=0 和 max=18?如果是这样,您如何编辑代码?谢谢
0赞 Mark 11/15/2023
我想说的是,假设第一行(也是唯一一行)是“1、2、5”。您是否希望它包含所有数字列,即 1 2 3 4 5,还是仅包含出现在行中的列
0赞 andy 11/15/2023
仅显示在行中的那些。此代码是否以这种方式工作,或者您是否必须进行编辑。这是我将使用的首选方法。
1赞 Mark 11/15/2023
是的,这就是我已经做过@andy
0赞 andy 11/15/2023
对不起,马克,我想包括所有的数字。