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

Log*_*gan 1 merge r

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

示例: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
Run Code Online (Sandbox Code Playgroud)

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
Run Code Online (Sandbox Code Playgroud)

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

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
Run Code Online (Sandbox Code Playgroud)

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

aos*_*ith 6

这是complete从包tidyr有用的情况(这是在tidyr_0.3.0,目前在github上可用).您可以使用此函数进行扩展df1以包括所有句点/灌木组合,NA默认情况下填充其他变量.一旦你这样做,你可以将两个数据集简单地连接在一起-我将使用inner_joindplyr.

图书馆(dplyr)图书馆(tidyr)

首先,使用completeon 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
..    ...   ...   ...
Run Code Online (Sandbox Code Playgroud)

然后,您需要做的就是将此扩展数据集加入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
..    ...   ...   ... . .
Run Code Online (Sandbox Code Playgroud)


Tho*_*mas 5

首先重复 的行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
Run Code Online (Sandbox Code Playgroud)

结果:

> 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 ...
Run Code Online (Sandbox Code Playgroud)