Расчет статистики из списка результатов в R - PullRequest
1 голос
/ 04 августа 2020

Я пытаюсь подсчитать результаты из одного набора данных, который я импортировал в R, и отобразить эти подсчеты в отдельном наборе данных, который создается в R для каждого уникального игрока.

Вот что такое упрощенная версия набор данных выглядит только с соответствующими столбцами:

Label <- c("Raul", "Raul", "Raul", "Eric", "Eric", "Eric", "Aaron", "Aaron", "Aaron") 
Result <- c("s", "b", "fo", "s", "f", "b", "ss", "go", "s") 
df2 <- data.frame(Label, Result)

Мои данные были скомпилированы в Excel и экспортированы как CSV с примерно 4000 строками с похожими результатами и примерно 45 уникальными «метками», но этот меньший пример показывает вы, как выглядит df. Вот пример того, что я хочу получить (разрывы строк для разделения строк):

Raul, count (s), count (b), count (fo), et c

Eri c, count (s), count (b), count (fo), et c

Aaron, count (s), count (b), count (fo) ), et c

Таким образом, каждая уникальная «метка» для игроков находится в строке, а столбцы - это количество каждого типа результата. Он должен дать мне 45 строк, по одной для каждого уникального игрока в моем наборе данных.

Мне удалось получить уникальные ярлыки игроков, выполнив это:

dfstat <- data.frame(unique(df2$Label)

Проблема возникает, когда я пытаюсь подсчитать каждый результат. Я пробовал разные вещи, например:

dfstat <- dfstat %>%
mutate(Strikes = count(subset(df2, Label = unique.df2.label & Result == "s")))

Но я получаю этот код ошибки: Error: Column ``Strikes`` is of unsupported class data.frame

И

df34$Strikes <- count(subset(df2, Label = unique.df2.label & Result == "s"))

Выдает мне эту ошибку code: Error in ``$<-.data.frame``(``*tmp*``, Strikes, value = list(n = 9L)) : replacement has 1 row, data has 3

Я делаю что-то похожее на то, чтобы быть частью Shiny App, и это работало без проблем, но это потому, что я смог подмножество для моего входного значения одного игрока. Но у меня возникли проблемы с получением этих данных подсчета для ВСЕХ уникальных игроков в моем наборе данных в другой набор данных в R.

Я благодарен за любую помощь с этой проблемой, потому что я действительно предпочел бы не вводить вручную все мои разные формулы подсчета для каждого уникального игрока. Спасибо!

Ответы [ 3 ]

0 голосов
/ 04 августа 2020

Вы можете ввести tapply, за которым следует rbind, убедившись, что недостающей статистике присвоено значение 0.

res <- tapply(df2$Result, df2$Label, function(x) {
              x <- table(x)
              x[setdiff(unique(df2$Result), names(x))] <- 0
              return(x[order(names(x))])
             })

Затем мы можем взять этот список подсчетов и rbind it

res <- do.call(rbind, res)

Теперь ваши игроки будут rownames

dfstat <- data.frame(label = row.names(res), res)
0 голосов
/ 04 августа 2020

Вы можете использовать table для подсчета частот для каждого игрока.

table(df2)

#       Result
#Label   b f fo go s ss
#  Aaron 0 0  0  1 1  1
#  Eric  1 1  0  0 1  0
#  Raul  1 0  1  0 1  0

Если в данных есть другие столбцы, вы можете указать столбцы, частоту которых вы хотите подсчитать.

table(df2$Label, df2$Result)

A tidyverse подход будет:

library(dplyr)
library(tidyr)

df2 %>%
  count(Label, Result) %>%
  pivot_wider(names_from = Result, values_from = n, values_fill = 0)
0 голосов
/ 04 августа 2020

Мы могли бы сгруппировать по метке и получить количество элементов s, взяв sum логического выражения

library(dplyr)
df2 %>%  
      group_by(Label) %>%
      summarise(n = sum(Result == 's'))

Или, чтобы получить частоту обоих элементов столбца

count(df2, Label, Result)

Если нам нужны все комбинации, то сделайте complete перед получением count

library(tidyr)
df2 %>%
     mutate(n = 1) %>%
     complete(Label, Result, fill = list(n = 0)) %>%
     group_by(Label, Result) %>% 
     summarise(n = sum(n))

ПРИМЕЧАНИЕ: count ожидает data.frame/tibble в качестве входных данных, поэтому он не будет работать в mutate, где он получает вектор в качестве входных

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...