当一列与另一列有关系时,如何在该列中填写 NA?
How can I fill NAs in one column when that column has a relationship with another column?
考虑以下数据:
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" 开头的所有行,Stadium 列值应为 "Fenway Park"。
- GameID 以 "Pit" 开头的所有行,Stadium 列值应为 "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()
and tidyr:fill()
的组合吗?
您可以使用多个 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
你走在正确的轨道上,这对我有用:
gd2 <- GameData %>%
mutate(nev =substr(GameID,1,3)) %>%
arrange(Stadium) %>%
group_by(nev) %>%
fill(Stadium)
使用评论中@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 个字符组成的临时分组列。
考虑以下数据:
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" 开头的所有行,Stadium 列值应为 "Fenway Park"。
- GameID 以 "Pit" 开头的所有行,Stadium 列值应为 "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()
and tidyr:fill()
的组合吗?
您可以使用多个 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
你走在正确的轨道上,这对我有用:
gd2 <- GameData %>%
mutate(nev =substr(GameID,1,3)) %>%
arrange(Stadium) %>%
group_by(nev) %>%
fill(Stadium)
使用评论中@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 个字符组成的临时分组列。