Как я могу заполнить NA в одном столбце, если этот столбец связан с другим столбцом? - PullRequest
0 голосов
/ 01 марта 2019

Рассмотрим следующие данные:

library(tidyverse)
GameID <- c('Bos001', 'Bos002', 'Bos003', 'Pit001', 'Pit002', 'Pit003')
Stadium <- c("Fenway Park", NA, "Fenway Park", NA, NA, "PNC Park")
GameData <- data.frame(GameID, Stadium)
GameData

GameID     Stadium
1 Bos001 Fenway Park
2 Bos002        <NA>
3 Bos003 Fenway Park
4 Pit001        <NA>
5 Pit002        <NA>
6 Pit003    PNC Park

Столбец Stadium связан со столбцом GameID.В этом надуманном примере:

  • Во всех строках, где GameID начинается с «Bos», значение столбца стадиона должно быть «Fenway Park».
  • Во всех строках, где GameID начинается с «Pit»значение столбца стадиона должно быть «PNC Park».

Tidied Data:

GameID     Stadium
1 Bos001 Fenway Park
2 Bos002 Fenway Park
3 Bos003 Fenway Park
4 Pit001    PNC Park
5 Pit002    PNC Park
6 Pit003    PNC Park

Как мне заполнить эти значения?

Должен ли я использовать комбинацию dplyr:arrange() и tidyr:fill()?

Ответы [ 3 ]

0 голосов
/ 01 марта 2019

Вы на правильном пути, и это сработало для меня:

gd2 <- GameData %>% 
mutate(nev =substr(GameID,1,3)) %>%
arrange(Stadium) %>% 
group_by(nev) %>% 
fill(Stadium)
0 голосов
/ 01 марта 2019

Используя предложение @markus из комментариев, мы с удовольствием удалим ответ, если они отправят ответ:

library(tidyverse)

GameData %>%
  group_by(GamePrefix = substr(GameID, 1, 3)) %>%
  mutate(Stadium = first(Stadium[!is.na(Stadium)])) %>%
  ungroup() %>%
  select(-GamePrefix)

# A tibble: 6 x 2
  GameID Stadium    
  <fct>  <fct>      
1 Bos001 Fenway Park
2 Bos002 Fenway Park
3 Bos003 Fenway Park
4 Pit001 PNC Park   
5 Pit002 PNC Park   
6 Pit003 PNC Park 

ungroup необходим для удаления столбца временной группировки, который состоит из первых 3 символовGameID значений.

0 голосов
/ 01 марта 2019

Вы можете использовать несколько if или поисковый фрейм данных;как то так:

> GameData %>%
+   mutate(Stadium = ifelse(grepl("^Bos", GameID), "Fenway Park", 
+                           ifelse(grepl("^Pit", GameID), "PNC Park", NA))
+          )
  GameID     Stadium
1 Bos001 Fenway Park
2 Bos002 Fenway Park
3 Bos003 Fenway Park
4 Pit001    PNC Park
5 Pit002    PNC Park
6 Pit003    PNC Park
...