【问题标题】:Summarise first row meeting a condition总结满足条件的第一行
【发布时间】:2020-01-31 13:57:23
【问题描述】:

假设我有这个数据框:

    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() 的条件,但现在没有运气。将不胜感激。

【问题讨论】:

  • 你如何识别具有“挑战者候选人”的行的逻辑是什么?
  • 可能有一种方法可以从这些数据中复制您想要的结果。但我认为如果你能提供一个比赛ID,可能会使这种方法更具可复制性。例如,如果数据看起来更像这样: “a”,“a”,“b”,“a”,“b”),投票= c(100,99,98,97,96),选举= c(1,1,1,0,0) ) ```通过解决方案,您可能更容易重复使用
  • 所有观察都属于同一次选举。挑战者候选人是第一个属于其他党的未经选择的候选人。例如,第一排来自派对A,因此挑战者是来自不同派对(即b)的最多投票的未经用的候选者,其中包括行5。 span>

标签: r dplyr conditional-statements lag summarize


【解决方案1】:

你可以试试函数

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

【讨论】:

    【解决方案2】:

    这是使用fuzzyjoin-package 的一种选择

    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
    
    

    也许这对你有用

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多