【问题标题】:Count Response Choices per Participant, include response choices with 0 responses计算每个参与者的响应选择,包括 0 个响应的响应选择
【发布时间】:2020-07-22 13:41:31
【问题描述】:

我有一个数据集,其中包含多个参与者对情绪面孔的反应。参与者以他们认为自己看到的情绪回应。每个参与者进行了多次试验。想象一下,有 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


【解决方案1】:

你可以使用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%

【讨论】:

  • 谢谢,成功了!我使用了您的建议并使用 pivot_longer 对其进行了重组,以提供我需要的数据。
【解决方案2】:

一种方法是使用forcats::fct_count():

library(dplyr)
library(forcats)

df2a_anger %>%
  mutate(Response = factor(Response)) %>%
  group_by(ppnum) %>%
  summarise(res = fct_count(Response, prop = TRUE))

`summarise()` ungrouping output (override with `.groups` argument)
# A tibble: 15 x 4
   ppnum f             n     p
   <chr> <fct>     <int> <dbl>
 1 1     Anger         0 0    
 2 1     Disgust       2 0.667
 3 1     Happiness     0 0    
 4 1     Neutral       0 0    
 5 1     Sadness       1 0.333
 6 2     Anger         2 0.667
 7 2     Disgust       0 0    
 8 2     Happiness     0 0    
 9 2     Neutral       1 0.333
10 2     Sadness       0 0    
11 3     Anger         1 0.333
12 3     Disgust       1 0.333
13 3     Happiness     1 0.333
14 3     Neutral       0 0    
15 3     Sadness       0 0    

【讨论】:

  • 这个输出看起来很像我正在寻找的输出,但是当我运行这个代码时(在我发布的示例数据或我的真实数据上)我收到一条错误消息:“错误:列res 的长度必须为 1(汇总值),而不是 3。”我认为您没有收到该错误?
  • 您需要更新为dplyr 1.0.0,它允许summarize 返回大于长度1 的结果。或者您可以返回一个列表并取消嵌套。
【解决方案3】:

基本的table() 函数在这种情况下就足够了。

提示:如果您将字符向量和数值向量组合到一个 data.frame,请不要使用 cbind(),因为这会强制所有列使用相同的原子对象类。使用data.frame() 函数将它们分段组合。

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 <- data.frame("Response" = Response,
                         "ResponseNum" = ResponseNum,
                         "Pnum" = ppnum) #create dataframe

table(df2a_anger$Pnum,df2a_anger$Response)
table(df2a_anger$Pnum,df2a_anger$ResponseNum)

absolutes = as.matrix(table(df2a_anger$Pnum,df2a_anger$Response))
proportions = absolutes/rowSums(absolutes)
barplot(t(proportions),legend.text = colnames(proportions),beside=T,ylim=c(0,1),xlab="Respondent")

此代码将为您提供两张表,一张是每个受访者的绝对计数,另一张是比例。

而且,作为奖励,它为您提供了以下情节:

【讨论】:

    猜你喜欢
    • 2019-07-21
    • 2012-01-08
    • 1970-01-01
    • 2012-01-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-11-11
    • 2016-10-11
    相关资源
    最近更新 更多