【问题标题】:Recognizing 'select all that apply' answers as being separate in R将“选择所有适用的”答案识别为在 R 中是分开的
【发布时间】:2015-12-20 04:39:12
【问题描述】:

我正在使用数据框,来自我进行的一项调查 (n=108)。其中一个问题(列)包含四个可能的答案 - 另一个,10。这是我的问题:当绘制这些列中的任何一个时,它会绘制每个级别。四个答案列被视为具有 13 个级别的因子,而 10 个答案列被视为具有 22 个级别的因子。每次有人选择多个答案时,它都算作一个单独的级别(即"A,B"、"A,B,C" 等)我的问题是,我该如何表示有多少受访者选择了"A" 或 "B" 或"A" 和 "B" 的组合,但不一定/仅 "A,B",无论做出了什么其他选择(如果有)。

我希望正确地绘制这些项目,并分析数据,例如,有多少 Female 受访者选择了 "A" 与有多少 Male 受访者,等等。

我的问题:

1) plot(data$letter) 绘制了 13 个不同的条形图,而 letter 是一个只有 4 个可能答案的问题,请选择所有适用的选项。

2) 我无法通过分析显示有多少人选择了"A",如果他们也碰巧选择了另一个答案,因为"A","C" 不等于"A"。

我正在寻找的解决方案:

1) 当plot(data$letter) 时,我只想要四个条形显示每个字母被选择了多少次。

2) 我需要在分析中使用 "A" 的所有值,即使受访者选择的不仅仅是 "A"

谢谢!

另外,How to clean and re-code check-all-that-apply responses in R survey data? 是我在发布之前发现的一个问题,它完整地解释了它,但代码在我的 R 经验水平上相当先进。

【问题讨论】:

    标签: r


    【解决方案1】:

    我可以给你两个想法,可能对你提到的两个问题有所帮助。首先,我创建一些示例数据:

    set.seed(175)
    choices <- c("A", "B", "C", "A,B", "A,C", "B,C", "A,B,C")
    data <- data.frame(respondent = 1:15,
                       letter = sample(choices, 15, replace = TRUE))
    data
    ##    respondent letter
    ## 1           1    A,C
    ## 2           2    B,C
    ## 3           3    A,B
    ## 4           4      C
    ## 5           5    B,C
    ## 6           6    A,B
    ## 7           7      B
    ## 8           8      A
    ## 9           9    B,C
    ## 10         10      C
    ## 11         11      A
    ## 12         12      B
    ## 13         13      C
    ## 14         14    A,C
    ## 15         15  A,B,C
    

    为简单起见,我只使用了三个级别。

    1) 可以使用以下函数以您想要的方式直接绘制`data$letter):

    plot_allapply <- function(choices) {
    
       # convert to character
       choices <- as.character(choices)
    
       # split at comma and unlist
       choices_split <- unlist(strsplit(choices, ","))
    
       # convert back to factor and plot
       plot(as.factor(choices_split))
    }
    plot_allapply(data$letter)
    

    它的工作原理如下:首先需要将letter中的数据从factor类型转换为character。 (我知道这是一个因素,否则你根本不会得到一个情节。)然后,字符向量的每个元素都以逗号分隔。 (运行strsplit(as.character(data$letter), ",") 以了解这对您的数据有何作用,运行?strsplit 以了解更多信息。)。由于这会产生一个列表,因此使用unlist 将其转换为字符向量。最后一行转换回factor(这是plot 创建正确类型的绘图所必需的)并被绘制。

    2) 您可以通过多种方式处理data$letter 中的数据。如果您有兴趣了解,哪些受访者选择了"B",您可以这样做

    grepl("B", data$letter)
    

    只要回复者的答案中包含"B",这将返回一个逻辑向量TRUE。因此,所有这些都会给TRUE:"B", "A,B", "A,B,C"。

    也许将这些信息添加到您的数据框中会有所帮助。这可以按如下方式完成:

    data <- transform(data, isA = grepl("A", letter),
                      isB = grepl("B", letter),
                      isC = grepl("C", letter))
    data
    ##    respondent letter   isA   isB   isC
    ## 1           1    A,C  TRUE FALSE  TRUE
    ## 2           2    B,C FALSE  TRUE  TRUE
    ## 3           3    A,B  TRUE  TRUE FALSE
    ## 4           4      C FALSE FALSE  TRUE
    ## 5           5    B,C FALSE  TRUE  TRUE
    ## 6           6    A,B  TRUE  TRUE FALSE
    ## 7           7      B FALSE  TRUE FALSE
    ## 8           8      A  TRUE FALSE FALSE
    ## 9           9    B,C FALSE  TRUE  TRUE
    ## 10         10      C FALSE FALSE  TRUE
    ## 11         11      A  TRUE FALSE FALSE
    ## 12         12      B FALSE  TRUE FALSE
    ## 13         13      C FALSE FALSE  TRUE
    ## 14         14    A,C  TRUE FALSE  TRUE
    ## 15         15  A,B,C  TRUE  TRUE  TRUE
    

    【讨论】:

    • 很难解释这对我有多大帮助,我目前唯一的另一个问题是,有没有一种方法可以将计数绘制为降序、升序(你是情节是偶然发生的),或者也许是最受追捧的,以一种类似于正态分布的方式对它们进行排序,其中最多的响应居中并且远离中心的数量减少?谢谢你的帮助,这对我帮助很大!
    • 很高兴能帮上忙。可以进行排序,我会将其添加到我的答案中。但我今晚只有时间。
    • @jnowat 我想了想,找到了一个可行的解决方案。但是,它与我上面发布的解决方案完全不同,我认为值得提出一个新问题。您不应该再次询问涉及拆分涉及多个字母的答案的部分,而只应询问如何使用您要求的三种不同顺序制作计数条形图。如果你愿意,我也可以为你提出问题。让我知道。如果您自己发布问题,如果您可以在此处添加问题链接作为评论,这将有所帮助。
    猜你喜欢
    • 1970-01-01
    • 2022-11-13
    • 2016-09-24
    • 1970-01-01
    • 2021-12-19
    • 2016-09-23
    • 2021-04-21
    • 1970-01-01
    • 2012-08-11
    相关资源
    最近更新 更多