Присоединение к дополнительным фреймам данных, без NA, где доступно значение - PullRequest
1 голос
/ 13 мая 2019

У меня есть два фрейма данных с объединяющим индексом v1. Мне нужно создать третий фрейм данных без значений NA, если число доступно.

Я пробовал различные комбинации функций соединения из dplyr и функции rbind.fill в plyr.

# Given
v1 <- c("a", "b", "c", "d")
df1 <- cbind.data.frame(v1, v2 = c(1,NA,3,NA))
df2 <- cbind.data.frame(v1, v2 = c(NA,2,NA,4))

# I would like
df3 <- cbind.data.frame(v1, v2 = c(1,2,3,4))

Как я могу сделать это возможным?

Ответы [ 4 ]

3 голосов
/ 13 мая 2019

Можно сделать full_join для 'v1', а затем coalesce для столбцов 'v2'

library(dplyr)
full_join(df1, df2, by = 'v1') %>%
    transmute(v1, v2 = coalesce(v2.x, v2.y))
2 голосов
/ 13 мая 2019

Вот простое базовое решение:

> df3 = df2
> df3$v2 = ifelse(is.na(df1$v2),df2$v2,df1$v2)
> df3
  v1 v2
1  a  1
2  b  2
3  c  3
4  d  4

ifelse выбирает число из одного или другого столбца на основе природы NA одного столбца.

Это неПокройте случай, если оба или ни один из исходных v2 столбцов не являются NA, но в вашем образце их нет, и вы не упоминаете об этом ...

1 голос
/ 13 мая 2019

Я уверен, что получил это от @ akrun , но не смог найти ветку.Публикация ответа для использования в будущем:

library(data.table)
setDT(df1)[df2, v2i := i.v2, on='v1'][is.na(v2), v2 := v2i][,v2i:= NULL][]
#>    v1 v2
#> 1:  a  1
#> 2:  b  2
#> 3:  c  3
#> 4:  d  4

Создано в 2019-05-13 пакетом Представить (v0.2.1)



@ Комментарий Хенрика также предлагает следующее:

setDT(df1)[is.na(v2), v2 := setDT(df2)[.SD, v2, on = .(v1)]]

, но я лично предпочитаю первое решение по этому, главным образом из-запоследовательность получения ответа (сначала присоединение к фреймам данных и замена NA позже).

0 голосов
/ 14 мая 2019

Вы можете использовать мой пакет safejoin

# devtools::install_github("moodymudskipper/safejoin)
library(safejoin)
safe_left_join(df1, df2, by = "v1", conflict = dplyr::coalesce)
#   v1 v2
# 1  a  1
# 2  b  2
# 3  c  3
# 4  d  4
...