Победители в парах;или векторное значение group_by mutate? - PullRequest
0 голосов
/ 26 сентября 2018

Я пытаюсь оценить, какая единица в паре является «победителем».group_by() %>% mutate() близко к правильной вещи, но это не совсем там.в частности

dat %>% group_by(pair) %>% mutate(winner = ifelse(score[1] > score[2], c(1, 0), c(0, 1))) не работает.

Ниже работает, но неуклюже с промежуточным сводным кадром данных.Можем ли мы улучшить это?

library(tidyverse)
set.seed(343)
# units within pairs get scores
dat <-
  data_frame(pair = rep(1:3, each = 2),
             unit = rep(1:2, 3),
             score = rnorm(6))

# figure out who won in each pair
summary_df <- 
  dat %>%
  group_by(pair) %>%
  summarize(winner = which.max(score))

# merge back and determine whether each unit won
dat <- 
  left_join(dat, summary_df, "pair") %>%
  mutate(won = as.numeric(winner == unit))
dat
#> # A tibble: 6 x 5
#>    pair  unit  score winner   won
#>   <int> <int>  <dbl>  <int> <dbl>
#> 1     1     1 -1.40       2     0
#> 2     1     2  0.523      2     1
#> 3     2     1  0.142      1     1
#> 4     2     2 -0.847      1     0
#> 5     3     1 -0.412      1     1
#> 6     3     2 -1.47       1     0

Создано в 2018-09-26 пакетом Представить (v0.2.0).

может быть связано с Странноgroup_by + mutate + which.max поведение

Ответы [ 2 ]

0 голосов
/ 26 сентября 2018

Использование rank:

dat %>% group_by(pair) %>% mutate(won = rank(score) - 1)

Больше для забавы (и немного быстрее), использование результатов сравнения (score[1] > score[2]) для индексации вектора с «выигранными альтернативами»:

dat %>% group_by(pair) %>%
  mutate(won = c(0, 1, 0)[1:2 + (score[1] > score[2])])
0 голосов
/ 26 сентября 2018

Вы можете сделать:

dat %>% 
  group_by(pair) %>% 
  mutate(won = score == max(score),
         winner = unit[won == TRUE]) %>% 
   # A tibble: 6 x 5
   # Groups:   pair [3]
   pair  unit  score won   winner
  <int> <int>  <dbl> <lgl>  <int>
1     1     1 -1.40  FALSE      2
2     1     2  0.523 TRUE       2
3     2     1  0.142 TRUE       1
4     2     2 -0.847 FALSE      1
5     3     1 -0.412 TRUE       1
6     3     2 -1.47  FALSE      1
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...