Как преобразовать фрейм данных в процент от категориальных данных - PullRequest
2 голосов
/ 03 апреля 2019

У меня есть фрейм данных, который содержит продольную информацию (длинный формат).

mydata<-structure(list(record_id = c("a", "a", "a", "b", "b", "b", "c", "c","c"),event = structure(c(1L, 2L, 3L, 1L, 2L, 3L, 1L, 2L, 3L), .Label =c("e2", "e3", "e4"), class = "factor"), var1 = structure(c(2L, 1L, 1L, 1L,1L, 1L, 1L, 1L, 1L), .Label = c("no", "yes"), class = "factor"),var2 =structure(c(1L, 1L, 1L, 2L, 2L, 1L, 1L, 1L, 1L), .Label = c("no", "yes"), class = "factor"), var3 = structure(c(2L, 2L, 1L, 2L, 2L, 1L, 1L, 1L, 1L),.Label = c("no", "yes"), class = "factor")), row.names = c(NA, -9L), class= c("tbl_df", "tbl", "data.frame"))

И мне нужно преобразовать эти данные в фрейм данных, который суммирует процентное значение числа «да» каждой переменной (var1, var2, var3) в соответствии с событием (e2, e3, e4) дляесть что-то вроде этого:

mydata_result<-structure(list(Event = structure(c(1L, 1L, 1L, 2L, 2L, 2L,3L, 3L, 3L), .Label = c("e2", "e3", "e4"), class = "factor"), Variable =structure(c(1L, 2L, 3L, 1L, 2L, 3L, 1L, 2L, 3L), .Label = c("var1", "var2", "var3"), class = "factor"), percentage_of_yes = c(0.33, 0.33, 0.66, 0, 0.33, 0.66, 0, 0, 0)), row.names = c(NA, -9L), class = c("tbl_df", "tbl","data.frame"))

Спасибо!

Ответы [ 2 ]

2 голосов
/ 03 апреля 2019

Вот альтернатива с data.table

library(data.table)
melt(setDT(mydata), id.vars = c("record_id", "event"))[, 
 .(percentage_of_yes = round(mean(value == "yes"), 3)), 
        .(event, Variable = variable)]
#    event Variable percentage_of_yes
#1:    e2     var1             0.333
#2:    e3     var1             0.000
#3:    e4     var1             0.000
#4:    e2     var2             0.333
#5:    e3     var2             0.333
#6:    e4     var2             0.000
#7:    e2     var3             0.667
#8:    e3     var3             0.667
#9:    e4     var3             0.000
2 голосов
/ 03 апреля 2019

Используя tidyverse, мы можем преобразовать в длинный формат, сгруппировать по нашей переменной и событию и выполнить подсчет процентов, то есть

library(tidyverse)

mydata %>% 
  gather(var, val, -c(1:2)) %>% 
  group_by(event, var) %>% 
  summarise(new = sum(val == 'yes')/n())

, что дает

# A tibble: 9 x 3
# Groups:   event [?]
  event var     new
  <fct> <chr> <dbl>
1 e2    var1  0.333
2 e2    var2  0.333
3 e2    var3  0.667
4 e3    var1  0    
5 e3    var2  0.333
6 e3    var3  0.667
7 e4    var1  0    
8 e4    var2  0    
9 e4    var3  0    
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...