首页 > 解决方案 > 计算每个参与者的响应选择,包括 0 个响应的响应选择

问题描述

我有一个数据集,其中包含多个参与者对情绪面孔的反应。参与者以他们认为自己看到的情绪回应。每个参与者进行了多次试验。想象一下,有 4 个答案可能性:厌恶、悲伤、愤怒和中立。我想计算每个参与者选择每个答案可能性的比例。当我最近问了一个类似的问题时,我得到了一个解决方案,后来证明它不适合我的需要。因此,我提出了这个新问题。

以下是一些示例数据:

Response <- c("Disgust", "Sadness", "Disgust", "Anger", "Anger", "Neutral", "Anger", "Disgust", "Happiness") #create example data
ResponseNum <- c(1,2,1,3,3,4,3,1,5) #Response, but expressed in Numbers
ppnum <- c(1,1,1,2,2,2,3,3,3)
df2a_anger <- as.data.frame(cbind(Response, ResponseNum, ppnum)) #create dataframe
df2a_anger$ResponseNum <- as.numeric(as.character(df2a_anger$ResponseNum)) # make numeric

这是一些示例代码:

library(dplyr)

df2a_anger %>%
    count(ppnum, ResponseNum) %>%
    group_by(ppnum) %>%
    mutate(n = n/sum(n))

我发现自己试图解决我的问题的另一种方法涉及聚合函数,但是两者都遇到相同的问题:当未选择响应选项时它们不计算在内:例如,参与者 1 选择的代码输出厌恶 66% 和悲伤33%。我还希望它输出参与者 1 选择中立和愤怒的 0%。有谁知道如何让 R 做到这一点?

标签: r

解决方案


你可以使用janitor

library(janitor)
library(dplyr)

df2a_anger %>% 
  tabyl(Response, ppnum) %>% 
  adorn_percentages(denominator = 'col') %>% 
  adorn_pct_formatting()

这给了你:

Response     1     2     3
     Anger  0.0% 66.7% 33.3%
   Disgust 66.7%  0.0% 33.3%
 Happiness  0.0%  0.0% 33.3%
   Neutral  0.0% 33.3%  0.0%
   Sadness 33.3%  0.0%  0.0%

或者,如果您希望将响应选项作为列标题:

df2a_anger %>% 
  tabyl(ppnum, Response) %>% 
  adorn_percentages(denominator = 'row') %>% 
  adorn_pct_formatting()

这给了你:

 ppnum Anger Disgust Happiness Neutral Sadness
     1  0.0%   66.7%      0.0%    0.0%   33.3%
     2 66.7%    0.0%      0.0%   33.3%    0.0%
     3 33.3%   33.3%     33.3%    0.0%    0.0%

推荐阅读