Процент команды с определенным количеством записей - PullRequest
0 голосов
/ 26 ноября 2018

У меня есть набор данных, который выглядит следующим образом:

> df
    teams people entries
1  A Team   6fd1      49
2  A Team   1df5       4
3  A Team   2hgt      19
4  A Team   8akt       4
5  A Team   sdf9      19
6  B Team   asc1      42
7  B Team   abm8      32
8  B Team   plo9      38
9  B Team   90la       5
10 B Team   8uil      23

> dput(df)
structure(list(teams = c("A Team", "A Team", "A Team", "A Team", 
"A Team", "B Team", "B Team", "B Team", "B Team", "B Team"), 
    people = c("6fd1", "1df5", "2hgt", "8akt", "sdf9", "asc1", 
    "abm8", "plo9", "90la", "8uil"), entries = c(49, 4, 19, 4, 
    19, 42, 32, 38, 5, 23)), .Names = c("teams", "people", "entries"
), row.names = c(NA, -10L), class = "data.frame")

Я могу получить процент команд, у которых более 75%, выполнив это, хотя и грязно и, вероятно, не лучшим образом:

#  sorted df and added cumulative percentage/sum and row number per team

> df
    teams people entries cumulative_sum cumulative_perc number
1  A Team   6fd1      49             49        51.57895      1
3  A Team   2hgt      19             68        71.57895      2
5  A Team   sdf9      19             87        91.57895      3
2  A Team   1df5       4             91        95.78947      4
4  A Team   8akt       4             95       100.00000      5
7  B Team   abm8      89             89        45.17766      1
6  B Team   asc1      42            131        66.49746      2
8  B Team   plo9      38            169        85.78680      3
10 B Team   8uil      23            192        97.46193      4
9  B Team   90la       5            197       100.00000      5

#  from this view, each team has 3/5 people (60%) reaching the minimum 75% 
#  entries, and using ddply, we can get that

ddply(df, 'teams', summarise,
      marker = min(which(cumulative_perc > 75)),
      total = NROW(teams),
      seventyfive = marker/total)

   teams marker total seventyfive
1 A Team      3     5       0.6
2 B Team      3     5       0.6

, и пока это работает, я хочу принять во внимание только процент записей третьего лица, которые на самом деле составляли 75% записей команд.Например, для команды A 75% их заявок составляют 72 (округлено), что означает, что мы рассматриваем только 4 из 19 заявок для третьего лица, что дает этой команде 2,21 / 5 вместо 3/5.

Ответы [ 2 ]

0 голосов
/ 27 ноября 2018

lead() дает вам переменную следующих строк в вашей текущей группе.

Фильтры ниже подхода для одной строки, которая является частью (0-1) записей следующей переменной, от минимального количествазаписей.

df %>%
    group_by(teams) %>%
    arrange(teams, -entries) %>%
    mutate(delta = (ceiling(0.75 * sum(entries)) - cumsum(entries)) / lead(entries),
           marker = row_number() + delta) %>%
    filter(delta >= 0 & delta <= 1) %>%
    select(teams, marker)

# A tibble: 2 x 2
# Groups:   teams [2]
  teams  marker
  <chr>   <dbl>
1 A Team   2.21
2 B Team   2.78
0 голосов
/ 27 ноября 2018
df %>% group_by(teams) %>% 
  summarise(seventyfive = {
    tmp1 <- ceiling(0.75 * sum(entries)); tmp2 <- sum(cumsum(entries) < tmp1)
    tmp2 + (tmp1 - sum(entries[1:tmp2])) / entries[tmp2 + 1]
  })
# A tibble: 2 x 2
#   teams  seventyfive
#   <chr>        <dbl>
# 1 A Team        2.21
# 2 B Team        2.78

tmp1 - это 75% записей, в то время как tmp2 - максимальное количество записей, в которых совокупный процент ниже 75%.Последняя строка затем непосредственно вычисляет желаемое количество.

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