Подведите итог первого ряда, удовлетворяющего условию - PullRequest
1 голос
/ 02 октября 2019

Допустим, у меня есть этот фрейм данных:

    df <- data.frame(
    party = c("A", "A", "B", "A", "B"), 
    votes = c(100, 99, 98, 97, 96), 
    elected = c(1, 1, 1, 0, 0, 0)
)

  party votes elected
1     A   100       1
2     A    99       1
3     B    98       1
4     A    97       0
5     B    96       0

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

  party votes elected votes_challenge
1     A   100       1              96
2     A    99       1              96
3     B    98       1              97
4     A    97       0              NA
5     B    96       0              NA

Я пробовал с first() и lag(), используя условие с which(), но пока безуспешно. Буду признателен за любую помощь.

Ответы [ 2 ]

1 голос
/ 02 октября 2019

Вы можете попробовать с функцией

library(dplyr)

get_opposite_votes <- function(df, group) { 
   df %>% filter(party != group & elected == 0) %>% slice(1L) %>% pull(votes)
}


df %>%
  group_by(party) %>%
  mutate(new = get_opposite_votes(., first(party))) %>%
  ungroup() %>%
  #If needed to have NA values where elected = 0
  mutate(new = replace(new, elected == 0, NA))

#  party votes elected   new
#  <fct> <dbl>   <dbl> <dbl>
#1 A       100       1    96
#2 A        99       1    96
#3 B        98       1    97
#4 A        97       0    NA
#5 B        96       0    NA
1 голос
/ 02 октября 2019

Это один из вариантов использования fuzzyjoin -пакета

library(fuzzyjoin)
library(tidyverse)

fuzzy_left_join(df, df %>% 
                  arrange(party, elected, desc(votes)) %>% 
                  group_by(party) %>% slice(1) , 
                by = c("party", "elected"), match_fun = list(`!=`, `>`)) %>%
select(ends_with("x"), votes.y)  

  party.x votes.x elected.x votes.y
1       A     100         1      96
2       A      99         1      96
3       B      98         1      97
4       A      97         0      NA
5       B      96         0      NA

Может быть, это работает для вас

...