Это можно сделать с помощью комбинации left_join
и anti_join
(из dplyr
).
Сначала я загружаю данные с character
вместо factor
, так как исправляювещи могут конфликтовать из-за привязки строк.
data <- data.frame(Name = c("Dex","Dex","Rex","Rex","Rex","Lex","Lex", "Nex","Nex","Nex"),
Year = c(2000, 2001, 2000, 2001, 2002, 2001, 2002, NA, 2001, 2002 ),
stringsAsFactors = FALSE)
data1 <- data.frame(Name = c("Nex","Nex","Nex"), Year = c(2000, 2001, 2002),
stringsAsFactors = FALSE)
Теперь модные вещи:
library(dplyr)
data %>%
filter(is.na(Year)) %>%
select(-Year) %>%
left_join(data1, by = "Name") %>%
anti_join(data, by = c("Name", "Year")) %>%
bind_rows(filter(data, !is.na(Year)))
# Name Year
# 1 Nex 2000
# 2 Dex 2000
# 3 Dex 2001
# 4 Rex 2000
# 5 Rex 2001
# 6 Rex 2002
# 7 Lex 2001
# 8 Lex 2002
# 9 Nex 2001
# 10 Nex 2002
Порядок немного не в порядке, потому что я ничего не пересортировал, ноВы можете легко это исправить с помощью arrange
.