группировка по категориям и вычисление по строке R

#r #dplyr #data-manipulation

#r #дплыр #манипулирование данными #dplyr

Вопрос:

У меня есть этот фрейм данных:

 > set.seed(100)
> df <- data.frame(X1 = sample(c(1:7, NA), 10, replace=TRUE),
                 X2 = sample(c(1:7, NA), 10, replace=TRUE),
                 X3 = sample(c(1:7, NA), 10, replace=TRUE),
                 YY = sample(c("a","b"), 10, replace=TRUE),
                 stringsAsFactors = FALSE)

> df
   X1 X2 X3 YY
1   3  5  5  a
2   3 NA  6  b
3   5  3  5  a
4   1  4  6  b
5   4  7  4  b
6   4  6  2  b
7   7  2  7  a
8   3  3 NA  b
9   5  3  5  b
10  2  6  3  a
  

Где конечным результатом является это:

 YY   XX
 a  -0.17
 b  -0.38
  

Формула для каждого процента равна:

( counts of c(6,7) counts of c(1,2,3,4) ) / counts of c(1,2,3,4,5,6,7) . Например, чтобы получить -0.17 для a :

 Where the columns are all (`X1, X2, X3`) and `YY = a`, then:
prom = counts of c(6,7) = 3
detr = counts of c(1,2,3,4) = 5 
total = counts of c(1,2,3,4,5,6,7) = 12 
The percentage is (prom - detr) / total = (2-3)/ 9 = -0.17
  

Однако я могу вычислять только по столбцам, когда использую summarize_all() :

 df %>%
  group_by(YY) %>%
  summarize_all(~ (sum(.x %in% 6:7) - sum(.x %in% 1:4)) / sum(.x %in% 1:7))

  YY        X1     X2     X3
  <chr>  <dbl>  <dbl>  <dbl>
1 a     -0.333 -1      0.333
2 b      0.167 -0.714 -0.667
  

Когда я хочу вычислить все столбцы, заданные по категории в YY , а не по столбцу (как показано в желаемом выводе выше).

Комментарии:

1. Я забыл это изменить. Изменение уже сделано

Ответ №1:

Можно было бы попробовать:

 library(tidyverse)

df %>%
  gather(key, val, -YY) %>%
  group_by(YY) %>%
  summarise(
    XX = ( sum(val %in% 6:7) - sum(val %in% 1:4) ) / sum(val %in% 1:7)
  ) 
  

Вывод:

 # A tibble: 2 x 2
  YY        XX
  <chr>  <dbl>
1 a     -0.167
2 b     -0.375
  

Ответ №2:

Попробуйте melt

 library(reshape2) 
library(dplyr) 

melt(df,'YY')%>%
    group_by(YY)%>%
   summarise(XX=(sum(value %in% 6:7) - sum(value %in% 1:4)) / sum(value%in% 1:7))
# A tibble: 2 x 2
     YY                 XX
  <chr>              <dbl>
1     a -0.714285714285714
2     b  0.105263157894737