当该列与另一列有关系时,如何在该列中填充NA?

时间:2019-03-01 19:14:22

标签: r dplyr tidyverse na tidyr

请考虑以下数据:

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”开头的所有行,“体育场”列的值应为“芬威球场”。
  • GameID以“坑”开头的所有行,“体育场”列的值应为“ PNC Park”。

整理的数据:

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 :(得分:2)

在评论中使用@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才能删除由GameID值的前3个字符组成的临时分组列。

答案 1 :(得分:0)

您可以使用多个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

答案 2 :(得分:0)

您在正确的轨道上,这对我有用:

gd2 <- GameData %>% 
mutate(nev =substr(GameID,1,3)) %>%
arrange(Stadium) %>% 
group_by(nev) %>% 
fill(Stadium)