Как я могу объединить данные с категориальными ответами, чтобы получить процент каждого типа ответа в R? - PullRequest
0 голосов
/ 21 апреля 2019

Я хочу получить проценты категориальных типов ответов для разных типов вопросов (ТИП).У меня есть несколько ответов для каждого типа для каждого человека, с несколькими категориальными ответами (разные уровни).

1) каждый индивидуум должен находиться в отдельной строке, а
2) столбцы должны иметь уровень ответа TYPES + со значением, выраженным в процентах от того, какой конкретный уровень ответа был задан дляэтот тип вопроса для этого человека.

ДАННЫЕ выглядят так:

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    

Любая помощь очень ценится, пожалуйста, также с некоторыми пояснениями.

1 Ответ

1 голос
/ 21 апреля 2019

Возможно, это не самый эффективный способ, но если вы хотите использовать 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)

DATA:

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

РЕДАКТИРОВАТЬ в ответ на комментарий:

Я понимаю, что вы хотите рассчитать процент по SUBJECT и TYPE, поэтому код будет выглядеть примерно так:

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)
...