оценка группы dplyr при одновременной оценке отдельных элементов - PullRequest
2 голосов
/ 06 мая 2019
library(tidyverse)
df <- tibble(`Roman Numeral` = c(rep("I", 3), rep("II", 3)),
             Letter = c("A", "B", "C", "D", "E", "F"),
             Value = c(10, 5, 22, 3, 25, 7),
             Threshold = rep(20, 6))

df
#> # A tibble: 6 x 4
#>   `Roman Numeral` Letter Value Threshold
#>   <chr>           <chr>  <dbl>     <dbl>
#> 1 I               A         10        20
#> 2 I               B          5        20
#> 3 I               C         22        20
#> 4 II              D          3        20
#> 5 II              E         25        20
#> 6 II              F          7        20

Вот мой df кадр данных выше. Мне нужно выполнить логику, включающую групповую оценку, одновременно оценивая одну строку. Я не знаю, имеет ли это смысл. Позвольте мне просто изложить то, что я пытаюсь сделать ниже, надеюсь, это понятно.

df.do <- df %>% 
  group_by(`Roman Numeral`) %>% 
  mutate(Violation = **see requested logic**)

Вот желаемый результат ниже. Как мне выполнить эту трехшаговую логику в tidyverse, возможно, с dplyr?

df.do  # (desired output)
#> # A tibble: 6 x 4
#>   `Roman Numeral` Letter Value Threshold Violation
#>   <chr>           <chr>  <dbl>     <dbl> <logical>
#> 1 I               A         10        20 TRUE
#> 2 I               B          5        20 TRUE
#> 3 I               C         22        20 TRUE
#> 4 II              D          3        20 FALSE
#> 5 II              E         25        20 FALSE
#> 6 II              F          7        20 FALSE
  1. Оцените каждую Roman Numeral группу отдельно
  2. Для каждой Roman Numeral группы; перейти к строке с буквой max() и определить (только для этой строки), превышает ли Value Threshold
  3. Если шаг № 2 (непосредственно выше) равен TRUE, заполните все Violation s для этой конкретной группы как TRUE, в противном случае заполните FALSE

1 Ответ

2 голосов
/ 06 мая 2019

Как уже arrange d, извлеките последнее 'Значение'

df %>% 
  group_by(`Roman Numeral`) %>%  
  mutate(Violation = last(Value) >= Threshold)
# A tibble: 6 x 5
# Groups:   Roman Numeral [2]
#  `Roman Numeral` Letter Value Threshold Violation
#  <chr>           <chr>  <dbl>     <dbl> <lgl>    
#1 I               A         10        20 TRUE     
#2 I               B          5        20 TRUE     
#3 I               C         22        20 TRUE     
#4 II              D          3        20 FALSE    
#5 II              E         25        20 FALSE    
#6 II              F          7        20 FALSE    

Если нет arrange d

df %>% 
  group_by(`Roman Numeral`) %>%  
  mutate(Violation = Value[which.max(factor(Letter))] >= Threshold)
  #or using `dense_rank`
  #mutate(Violation = Value[which.max(dense_rank(Letter))] >= Threshold)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...