Заменить строки самой длинной строкой в ​​группе - PullRequest
2 голосов
/ 18 февраля 2020

Рассмотрите этот фрейм данных

df <- data.frame(name = c("Dirk Nowitzki", "Dirk Nowitzki", "LeBron James", "Lebron James", "Kobe Bryant", "Kobe Bryant"),
                 team = c("Mavericks", "Mavs", "Cavs", "Cavaliers", "Lakers", "Lakers"))
           name      team
1 Dirk Nowitzki Mavericks
2 Dirk Nowitzki      Mavs
3  LeBron James      Cavs
4  Lebron James Cavaliers
5   Kobe Bryant    Lakers
6   Kobe Bryant    Lakers

Я хотел бы заменить сокращенные названия команд их более длинными аналогами и получить это

           name      team
1 Dirk Nowitzki Mavericks
2 Dirk Nowitzki Mavericks
3  LeBron James Cavaliers
4  Lebron James Cavaliers
5   Kobe Bryant    Lakers
6   Kobe Bryant    Lakers

Это достаточно просто использовать gsub или str_replace чтобы сделать это один за другим в игрушечном примере, но фактический набор данных содержит тысячи неполных строк.

Я могу сгруппировать по имени и определить, какое имя команды самое длинное, но затем я застреваю

df %>% 
  group_by(name) %>% 
  mutate(str_len = str_length(team))

Ответы [ 2 ]

2 голосов
/ 18 февраля 2020

Некоторые «имена различаются в зависимости от конкретного случая, поэтому при группировке лучше изменить его на общий случай, а затем получить индекс максимальной длины на which.max и заменить« team »соответствующим значением для« команда '

library(stringr)
library(dplyr)
df %>% 
   group_by(name2 = toupper(name)) %>% 
   mutate(team = team[which.max(str_length(team))]) %>%
   ungroup  %>%
   select(-name2)
# A tibble: 6 x 2
#  name          team     
#  <fct>         <fct>    
#1 Dirk Nowitzki Mavericks
#2 Dirk Nowitzki Mavericks
#3 LeBron James  Cavaliers
#4 Lebron James  Cavaliers
#5 Kobe Bryant   Lakers   
#6 Kobe Bryant   Lakers   
0 голосов
/ 18 февраля 2020
df <- df %>%
  mutate(team_full = case_when(
     team == 'Cavs' ~ 'Cavaliers',
     team == 'Mavs' ~ 'Mavericks',
     TRUE ~ team))

* Обратите внимание, что списки могут быть более инклюзивными для нескольких значений, таких как ...

team %in% c('Mavs', 'mavs', 'Mavrix') ~ 'Mavericks,
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...