完整的数据框

时间:2018-03-06 00:34:02

标签: r tidyr

使用以下数据:

library(tidyverse)

df <- tibble(
  z1 = 1:2,
  z2 = 1:2,
  prob1 = c(0.1, 0.2),
  prob2 = c(0.3, 0.4)
)

df
#> # A tibble: 2 x 4
#>      z1    z2 prob1 prob2
#>   <int> <int> <dbl> <dbl>
#> 1     1     1 0.100 0.300
#> 2     2     2 0.200 0.400

我想要实现的目标是:

tibble(
  z1 = c(1, 1, 2, 2),
  z2 = c(1, 2, 1, 2), 
  prob1 = c(0.1, 0.1, 0.2, 0.2),
  prob2 = c(0.3, 0.4, 0.3, 0.4)
)
#> # A tibble: 4 x 4
#>      z1    z2 prob1 prob2
#>   <dbl> <dbl> <dbl> <dbl>
#> 1    1.    1. 0.100 0.300
#> 2    1.    2. 0.100 0.400
#> 3    2.    1. 0.200 0.300
#> 4    2.    2. 0.200 0.400

我怀疑我应该使用complete()dplyr中的其他功能。 到目前为止,我想出了这个不起作用的解决方案:

df %>% 
  complete(z1, z2)
#> # A tibble: 4 x 4
#>      z1    z2  prob1  prob2
#>   <int> <int>  <dbl>  <dbl>
#> 1     1     1  0.100  0.300
#> 2     1     2 NA     NA    
#> 3     2     1 NA     NA    
#> 4     2     2  0.200  0.400

1 个答案:

答案 0 :(得分:1)

您希望仅包含z1 / prob1z2 / prob2的现有组合,因此您应在这些对中使用nesting()

df %>% 
    complete(nesting(z1, prob1), nesting(z2, prob2))

输出:

# A tibble: 4 x 4
     z1 prob1    z2 prob2
  <int> <dbl> <int> <dbl>
1     1 0.100     1 0.300
2     1 0.100     2 0.400
3     2 0.200     1 0.300
4     2 0.200     2 0.400