Замена строк из одного фрейма данных на строки из другого фрейма данных - PullRequest
0 голосов
/ 16 февраля 2019

У меня есть 2 кадра данных, один из которых содержит пропущенное значение.Первый кадр данных выглядит следующим образом:

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))

# Name  Year
# DEX   2000
# DEX   2001
# REX   2000
# REX   2002
# REX   2002
# LEX   2001
# LEX   2002
# NEX    NA
# NEX   2001
# NEX   2002

Второй кадр данных:

data1 <- data.frame(Name = c("Nex","Nex","Nex"), Year = c(2000, 2001, 2002))

# Name  Year
# NEX   2000
# NEX   2001
# NEX   2002

Я хотел бы заменить отсутствующее значение в кадре данных data соответствующим образом размещеннымзначение из фрейма данных data1.

Результат должен быть:

# Name  Year
# DEX   2000
# DEX   2001
# REX   2000
# REX   2002
# REX   2002
# LEX   2001
# LEX   2002
# NEX   2000
# NEX   2001
# NEX   2002

Кажется, что было бы проще заменить 3 строки с именем NEX в data на 3строки в data1 или каким-либо образом объединить 2 фрейма данных так, чтобы строки в data1 были объединены с соответствующими строками data.Тем не менее, я в растерянности, как это сделать.

Ответы [ 4 ]

0 голосов
/ 16 февраля 2019

Я думаю, что есть простой способ сделать это.Сначала отфильтруйте экземпляры Nex в Name, учитывая, что мы, вероятно, не знаем полной значимости порядка, затем поместите один кадр данных поверх другого с помощью bind_rows:

library(tidyverse)

data %>% 
  filter(Name != "Nex") %>%
  bind_rows(data1)

   Name Year
1   Dex 2000
2   Dex 2001
3   Rex 2000
4   Rex 2001
5   Rex 2002
6   Lex 2001
7   Lex 2002
8   Nex 2000
9   Nex 2001
10  Nex 2002
0 голосов
/ 16 февраля 2019

Предполагая, что порядок здесь имеет смысл (по группам в данных и по отдельности в data1), вы можете добавить столбец id для присоединения.

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 ))

data1 <- data.frame( Name = c("Nex","Nex","Nex"), Year = c(2000, 2001, 2002))

data <- data %>%
  group_by(Name) %>% 
  mutate( # creating index by groups to join
    Index = 1:n()
  ) %>% 
  ungroup()

data1 <- data1 %>% 
  mutate( # index, no groups
    Index = 1:n()
  )

dataFill <- data %>% 
  left_join(data1, by = c("Name", "Index")) %>% 
  mutate( # if_else will help us fill in values that are missing selectively
    YearComplete = if_else(
      is.na(Year.x),
      Year.y,
      Year.x
    )
  )
0 голосов
/ 16 февраля 2019

Как насчет этого?Предполагается: (1) у вас всегда есть таблица данных NEX без NA.(2) И порядок всегда совпадает с таблицей данных с NA

data$Year[data$Name == "Nex" ] <- data1$Year
0 голосов
/ 16 февраля 2019

Это можно сделать с помощью комбинации 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.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...