группировка по категориям, подсчет, сумма и деление одновременно - R - PullRequest
0 голосов
/ 05 марта 2019

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

> 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   X1     X2    X3
 a  -0.25  -0.25  0
 b  -0.83  -0.2   0

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

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

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

И я пытаюсь добиться этого вывода через цикл в каждом столбце (X1,X2, and X3), где для каждого столбца:

 > table(df[,X1], df$YY)
    a b
  1 0 1
  2 1 0
  3 1 2
  4 0 2
  5 1 1
  7 1 0

И суммируйте соответствующие числа для a и b. Но я изо всех сил пытаюсь получить доступ к этим table() и, для каждого YY, суммировать соответствующие подсчеты, сложить их и разделить их на общее количество подсчетов. Я думал о том, чтобы получить доступ к таблице и суммировать по критериям с помощью expss::sum_if(), но я до сих пор не нашел пути.

Есть ли более простой способ сделать это? Любая идея?. Я также пробовал использовать dplyr, но это кажется более сложным, когда мне нужно сгруппировать по категориям и подсчитать, суммировать и разделить по столбцам и закончить с этим небольшим выводом.

Ответы [ 3 ]

2 голосов
/ 05 марта 2019

Мы можем создать функцию get_ratio на основе нашей формулы

get_ratio <- function(x) {
  (sum(x %in% 6:7) - sum(x %in% 1:4))/sum(x %in% 1:7)
}

и теперь примените его для каждой группы (YY)

library(dplyr)

df %>%
  group_by(YY) %>%
  summarise_at(vars(X1:X3), get_ratio)

#    YY       X1     X2    X3
#   <fct>    <dbl>  <dbl> <dbl>
#1    a     -0.5     -1     0
#2    b      0.25    -1    -1
2 голосов
/ 05 марта 2019

Сгруппируйте по YY, а затем суммируйте каждый сгруппированный столбец, используя указанную функцию (выраженную в формуле).

library(dplyr)

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

дает:

# A tibble: 2 x 4
  YY       X1    X2    X3
  <fct> <dbl> <dbl> <dbl>
1 a     -0.5     -1     0
2 b      0.25    -1    -1
0 голосов
/ 05 марта 2019

Вы хотите сделать что-то подобное?

    NPS_count <- function(x, prom=c(6,7), detr=seq(1:4)) {
      case_when(x %in% prom ~ 1,
                x %in% detr ~ -1,
                TRUE ~ 0)
    }


    df %>% 
  group_by(YY) %>% 
  summarise(X1 = sum(NPS_count(X1))/n(),
            X2 = sum(NPS_count(X2))/n(),
            X3 = sum(NPS_count(X3))/n())
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...