如何在R中合并两个数据帧但保留所有缺失值。

时间:2015-08-28 20:34:29

标签: r merge

我需要组合到具有不同长度的数据帧,并保留所有“缺失值”。问题是没有真正缺失的值,而只是一个值比另一个值少。

实施例: df1看起来像这样:

Shrub value period
1     0.5   1  
2     0.6   1
3     0.7   1
4     0.8   1 
5     0.9   1
10    0.9   1
1     0.4   2
5     0.4   2
6     0.5   2
7     0.3   2
2     0.4   3
3     0.1   3
8     0.5   3
9     0.2   3

df2看起来像这样:

Shrub   x    y
1       5    8
2       6    7
3       3    2
4       1    2
5       4    6 
6       5    9
7       9    4 
8       2    1   
9       4    3
10      3    6

我希望组合的数据框看起来像:

Shrub   x    y    value   period
1       5    8    0.5        1
2       6    7    0.6        1
3       3    2    0.7        1
4       1    2    0.8        1
5       4    6    0.9        1 
6       5    9    NA         1
7       9    4    NA         1 
8       2    1    NA         1   
9       4    3    NA         1
10      3    6    0.9        1
1       5    8    0.4        2
2       6    7    NA         2
3       3    2    NA         2
4       1    2    NA         2
5       4    6    0.4        2
6       5    9    0.5        2
7       9    4    0.3        2
8       2    1    NA         2
9       4    3    NA         2
10      3    6    NA         2
1       5    8    NA         3
2       6    7    0.4        3
3       3    2    0.1        3
4       1    2    NA         3
5       4    6    NA         3
6       5    9    NA         3
7       9    4    NA         3 
8       2    1    0.5        3   
9       4    3    0.2        3
10      3    6    NA         3

我使用all = TRUE尝试了merge命令,但是这并没有给我我想要的东西。我无法在任何地方找到这个,所以任何帮助表示赞赏!

3 个答案:

答案 0 :(得分:6)

这种情况是包 tidyr 中的complete有用(这是在tidyr_0.3.0中,目前可在github上获得)。您可以使用此函数展开df1以包含所有句点/灌木组合,默认情况下使用NA填充其他变量。完成后,您只需将两个数据集连接在一起 - 我将使用 dplyr 中的inner_join

库(dplyr) 库(tidyr)

首先,在complete上使用df1,显示前10行输出:

complete(df1, period, Shrub)

Source: local data frame [30 x 3]

   period Shrub value
1       1     1   0.5
2       1     2   0.6
3       1     3   0.7
4       1     4   0.8
5       1     5   0.9
6       1     6    NA
7       1     7    NA
8       1     8    NA
9       1     9    NA
10      1    10   0.9
..    ...   ...   ...

然后您需要做的就是将此扩展数据集与df2

连接起来
complete(df1, period, Shrub) %>%
    inner_join(., df2)
Source: local data frame [30 x 5]

   period Shrub value x y
1       1     1   0.5 5 8
2       1     2   0.6 6 7
3       1     3   0.7 3 2
4       1     4   0.8 1 2
5       1     5   0.9 4 6
6       1     6    NA 5 9
7       1     7    NA 9 4
8       1     8    NA 2 1
9       1     9    NA 4 3
10      1    10   0.9 3 6
..    ...   ...   ... . .

答案 1 :(得分:4)

首先重复df2行以创建“完整”数据集(即30行,每个灌木周期观察一行),然后合并:

tmp <- df2[rep(seq_len(nrow(df2)), times=3),]
tmp$period <- rep(1:3, each = nrow(df2))
out <- merge(tmp, df1, all = TRUE)
rm(tmp) # remove `tmp` data.frame

结果:

> head(out)
  Shrub period x y value
1     1      1 5 8   0.5
2     1      2 5 8   0.4
3     1      3 5 8    NA
4     2      1 6 7   0.6
5     2      2 6 7    NA
6     2      3 6 7   0.4

> str(out)
'data.frame':   30 obs. of  5 variables:
 $ Shrub : int  1 1 1 2 2 2 3 3 3 4 ...
 $ period: int  1 2 3 1 2 3 1 2 3 1 ...
 $ x     : int  5 5 5 6 6 6 3 3 3 1 ...
 $ y     : int  8 8 8 7 7 7 2 2 2 2 ...
 $ value : num  0.5 0.4 NA 0.6 NA 0.4 0.7 NA 0.1 0.8 ...

答案 2 :(得分:1)

您可以使用dplyr。这可以通过将每个句点放在一个单独的框架中,并与all=TRUE合并来强制所有值,然后将它们全部重新组合在一起。 cbind(df2,..部分会将期间添加到缺失值中,因此我们无法获得额外的NA。:

library(dplyr)
df1 %>% group_by(period) %>%
        do(merge(., cbind(df2, period = .[["period"]][1]), by = c("Shrub", "period"), all = TRUE))

   Shrub period value x y
1      1      1   0.5 5 8
2      2      1   0.6 6 7
3      3      1   0.7 3 2
4      4      1   0.8 1 2
5      5      1   0.9 4 6
6      6      1    NA 5 9
7      7      1    NA 9 4
8      8      1    NA 2 1
9      9      1    NA 4 3
10    10      1   0.9 3 6
11     1      2   0.4 5 8
12     2      2    NA 6 7
13     3      2    NA 3 2
14     4      2    NA 1 2
15     5      2   0.4 4 6
16     6      2   0.5 5 9
17     7      2   0.3 9 4
18     8      2    NA 2 1
19     9      2    NA 4 3
20    10      2    NA 3 6
21     1      3    NA 5 8
22     2      3   0.4 6 7
23     3      3   0.1 3 2
24     4      3    NA 1 2
25     5      3    NA 4 6
26     6      3    NA 5 9
27     7      3    NA 9 4
28     8      3   0.5 2 1
29     9      3   0.2 4 3
30    10      3    NA 3 6