簡體   English   中英

如何在R中合並兩個數據框,但保留所有缺失值。

[英]How do i merge two dataframes in R but keep all missing values.

我需要合並到具有不同長度的數據幀,並保留所有“缺失值”。 問題在於並沒有真正缺失的值,而是一個值比另一個值少。

示例: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命令,但這沒有給我我想要的東西。 我無法在任何地方找到它,因此不勝感激!

在這種情況下,從tidyr包中complete是很有用的(這在tidyr_0.3.0中,當前在github上可用)。 您可以使用此功能將df1擴展為包括所有期間/灌木組合,默認情況下用NA填充其他變量。 完成后,您可以將兩個數據集簡單地連接在一起-我將使用inner_joininner_join

庫(dplyr)庫(tidyr)

首先,在df1上使用complete ,顯示輸出的前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
..    ...   ...   ... . .

首先重復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 ...

您可以使用dplyr 通過將每個周期放在一個單獨的幀中,然后與all=TRUE合並以強制使用所有值,然后將其重新組合在一起,可以起作用。 cbind(df2,..部分將周期添加到缺失值上,因此我們不會得到額外的NA cbind(df2,..

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM