Как переместить значения в пустые ячейки в другом кадре данных в R? - PullRequest
0 голосов
/ 11 января 2020

У меня есть два кадра данных. У обоих есть столбец 'year' и ряд других идентификаторов, таких как:

year <- c("1990", "2000", "2010", "", "")
name <- c("id1", "id2", "id3", "id4", "id5")
other <- c("dhg", "fsgh", "fgskgs", "fsjg", "wod")
df1 <- data.frame(name, year)
year <- c("", "", "", "2009", "2013")
name <- c("id1", "id2", "id3", "id4", "id5")
df2 <- data.frame(name, year)

Я хочу объединить их так, чтобы столбец, который не является общим для обоих, сохранялся, но все значения года объединены в один столбец. Итак, желаемый результат:

year <- c("1990", "2000", "2010", "2009", "2013")
name <- c("id1", "id2", "id3", "id4", "id5")
other <- c("dhg", "fsgh", "fgskgs", "fsjg", "wod")
df3 <- data.frame(name, year)

Пытался использовать слияние для этого, но я не могу заставить его работать. Я уверен, что решение простое. У кого-нибудь есть идеи как получить желаемый результат? Заранее спасибо!

Ответы [ 3 ]

3 голосов
/ 11 января 2020

Комбинируя функцию слияния и вставки, вы можете объединить столбец «имя» и вставить столбцы «год», чтобы создать один столбец. Затем вы можете просто добавить «другой» вектор в фрейм данных, создав новый столбец.

year <- c("1990", "2000", "2010", "", "")
name <- c("id1", "id2", "id3", "id4", "id5")
other <- c("dhg", "fsgh", "fgskgs", "fsjg", "wod")
df1 <- data.frame(name, year)

year <- c("", "", "", "2009", "2013")
name <- c("id1", "id2", "id3", "id4", "id5")
df2 <- data.frame(name, year)

df3 <- merge(df1, df2, all.x = TRUE)
df3$year <- paste(df1$year, df2$year)
df3$other <- other

Создание следующего фрейма данных ('df3'):

 name  year  other
1  id1 1990     dhg
2  id2 2000    fsgh
3  id3 2010  fgskgs
4  id4  2009   fsjg
5  id5  2013    wod
2 голосов
/ 11 января 2020

Вот простое базовое решение R с использованием ifelse.

Сначала преобразуйте year, который является фактором, в символ в обоих кадрах:

df1$year <- as.character(df1$year)
df2$year <- as.character(df2$year)

Затем используйте ifelse вставить соответствующие годы в (более полное) df1:

df1$year <- ifelse(df1$year=="", df2$year, df1$year)
df1
  name year  other
1  id1 1990    dhg
2  id2 2000   fsgh
3  id3 2010 fgskgs
4  id4 2009   fsjg
5  id5 2013    wod
0 голосов
/ 11 января 2020

Мы можем заменить пустые значения на NA в обоих кадрах данных, выполнить внутреннее соединение и использовать coalesce для объединения двух столбцов.

library(dplyr)

inner_join(df1 %>%  na_if(""), df2 %>% na_if(""), by = "name") %>%
  mutate_all(as.character) %>%
  mutate(year = coalesce(year.x, year.y)) %>%
  select(names(df1))

#  name year  other
#1  id1 1990    dhg
#2  id2 2000   fsgh
#3  id3 2010 fgskgs
#4  id4 2009   fsjg
#5  id5 2013    wod

данные

Включая other столбец в df1

year <- c("1990", "2000", "2010", "", "")
name <- c("id1", "id2", "id3", "id4", "id5")
other <- c("dhg", "fsgh", "fgskgs", "fsjg", "wod")
df1 <- data.frame(name, year, other)


year <- c("", "", "", "2009", "2013")
name <- c("id1", "id2", "id3", "id4", "id5")
df2 <- data.frame(name, year)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...