【问题标题】:How can I aggregate data with categorical responses to get the percentage of each response type in R?如何聚合具有分类响应的数据以获取 R 中每种响应类型的百分比?
【发布时间】:2019-04-21 11:57:49
【问题描述】:

我想获取不同类型问题 (TYPE) 的分类答案类型的百分比。我对每个人的每种类型都有多个响应,具有多个分类响应(不同级别)。

1) 每个人都应该在不同的行,并且
2) 列应该是类型+响应级别,其值是针对该个人的该问题类型给出特定响应级别的次数百分比。

数据看起来像这样:

SUBJECT TYPE    RESPONSE  
John    a   kappa                       
John    b   gamma  
John    a   delta  
John    a   gamma  
Mary    a   kappa   
Mary    a   delta       
Mary    b   kappa  
Mary    a   gamma  
Bill    b   delta  
Bill    a   gamma  

结果应该是这样的:

SUBJECT a-kappa     a-gamma   a-delta   b-kappa     b-gamma b-delta
John    0.33        0.33      0.33      1.00        1.00    0.00
Mary    0.66        0.33      0.00      1.00        0.00    0.00
Bill    1.00        0.00      0.00      0.00        0.00    1.00

根据 c1au61o_HH 的回答,我能够创建适用于我的实际数据文件的东西,但仍需要一些后处理。 (它也不是很优雅,但这是一个小问题。)

 Finaldf <- mydata %>%     
 group_by(Subject,Type) %>%     
 mutate(TOT = n()) %>%      
 group_by(Subject, Response, Type) %>%     
 mutate(RESPTOT = n())     

 Finaldf <- distinct(Finaldf)    
 Finaldf$Percentage <- Finaldf$RESPTOT/Finaldf$TOT    

非常感谢任何帮助,也请提供一些解释。

【问题讨论】:

    标签: r dataframe aggregate


    【解决方案1】:

    这可能不是最有效的方法,但如果您想使用 tidyverse,您可以合并 2 列,然后执行 2 个不同的 group_by 来计算每个主题的总数和百分比。

    library(tidyverse)
    df %>% 
      unite(TYPE_RESPONSE, c("TYPE", "RESPONSE"), sep = "_") %>% 
      group_by(SUBJECT) %>% 
      mutate(TOT = n()) %>% 
      group_by(SUBJECT, TYPE_RESPONSE) %>% 
      summarize(perc = n()/TOT * 100) %>% 
      spread(TYPE_RESPONSE, perc)
    

    数据:

    df <- tibble( SUBJECT= rep(c("John", "Mary","Bill"), each = 4), 
                     TYPE = rep(c("a","b"), 6),
                     RESPONSE = rep(c("kappa", "gamma", "delta"), 4)
    )
    

    编辑回复评论:

    我了解到您想通过SUBJECTTYPE 计算百分比,所以代码是这样的:

    library(tidyverse)
    df %>% 
      group_by(SUBJECT, TYPE) %>% 
      mutate(TOT = n()) %>%
      unite(TYPE_RESPONSE, c("TYPE", "RESPONSE"), sep = "_") %>% 
      group_by(SUBJECT, TYPE_RESPONSE) %>% 
      summarize(perc = n()/TOT * 100)%>% 
      spread(TYPE_RESPONSE, perc)
    

    【讨论】:

    • 谢谢,这给了我一些想法。但我需要例如百分比gamma,仅在 Type a 问题中。所以上面的 John 代码给出了 a_kappa 和 a_delta 的百分比 25 和 25,a_gamma 的百分比为 NA,但我需要得到 John 的 50% 的“a”响应是 kappa,50% 是 delta。
    • 所以它是主题内类型内响应的百分比,对吧?
    • 谢谢!我能够编写一些适用于我的数据文件的东西,但不能完全生成我想要的输出格式。我把它贴在上面。再次感谢。
    • 你试过我提供的更新代码了吗?这不是你想要的吗?
    • 嗨,这适用于生成的数据,但是当我用我的实际数据框尝试它时,它给了我例如某些值是 200%。我不确定为什么。但是通过上面的工作,我能够得到我需要的东西。非常感谢您的帮助!
    猜你喜欢
    • 2018-08-25
    • 2021-11-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-10-21
    • 2019-06-23
    • 1970-01-01
    • 2020-09-22
    相关资源
    最近更新 更多