连接两个数据框以删除第一个数据框中的NaN值

时间:2019-02-21 11:51:19

标签: r dataframe merge

我想合并两个数据框列。

我有df1,并且有特定的列(df $ col1)。该列有1-100行,某些行具有NA值(例如,行10、15、20、50、69)。

数据框2具有第10、15、20、50、69行。

是否可以将DF2合并到df $ col中,以便DF2仅填充df $ col中的NA值。取决于每个数据集的索引号

我尝试了这个,但是得到的数据框看起来并不像我想要的

merge(brfss2$pa1min_,df,by.x=1,by.y=1,all.x=TRUE,all.y=TRUE)

这是两个数据框

Dataframe1:

1 NA
2 110
3 NA
4 35
5 NA
6 120
7 280
8 30
9 240
10 260
11 322
12 NA

数据框2:

1 2127.6
3 1403.0
5 198.0
12 112.8

2 个答案:

答案 0 :(得分:1)

另一种方法-我导入了您的数据并指定了列名:

df <- structure(list(col1 = c(1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12
), col2 = c(NA, 110, NA, 35, NA, 120, 280, 30, 240, 260, 322, 
NA)), class = c("spec_tbl_df", "tbl_df", "tbl", "data.frame"), row.names = c(NA, 
-12L), spec = structure(list(cols = list(col1 = structure(list(), class = c("collector_double", 
"collector")), col2 = structure(list(), class = c("collector_double", 
"collector"))), default = structure(list(), class = c("collector_guess", 
"collector")), skip = 2), class = "col_spec"))

df2 <- structure(list(col1 = c(1, 3, 5, 12), col2 = c(2127.6, 1403, 
198, 112.8)), class = c("spec_tbl_df", "tbl_df", "tbl", "data.frame"
), row.names = c(NA, -4L), spec = structure(list(cols = list(
col1 = structure(list(), class = c("collector_double", "collector"
)), col2 = structure(list(), class = c("collector_double", 
"collector"))), default = structure(list(), class = c("collector_guess", 
"collector")), skip = 2), class = "col_spec"))

使用tidyverse可以合并,然后根据没有NA的值有条件地添加新列:

library(tidyverse)

df %>% 
  merge(df2, by = "col1", all.x = TRUE) %>% 
  mutate(new_col = if_else(is.na(col2.x), col2.y, col2.x)) %>% 
  select(new_col)

   new_col
1     2127.6
2     110.0
3     1403.0
4     35.0
5     198.0
6     120.0
7     280.0
8     30.0
9     240.0
10    260.0
11    322.0
12    112.8

答案 1 :(得分:0)

我编写了safejoin软件包,它非常简洁地解决了这个问题

# devtools::install_github("moodymudskipper/safejoin")
safe_left_join(df1,df2, by = "col1", conflict = dplyr::coalesce)
# # A tibble: 12 x 2
#     col1  col2
#    <dbl> <dbl>
#  1     1 2128.
#  2     2  110 
#  3     3 1403 
#  4     4   35 
#  5     5  198 
#  6     6  120 
#  7     7  280 
#  8     8   30 
#  9     9  240 
# 10    10  260 
# 11    11  322 
# 12    12  113.