tidyverse 使用重复键传播并根据唯一键填充 NA

tidyverse spread with duplicate keys and fill NAs based on unique keys

考虑最小的例子:

library(tidyverse)
ex <-tribble(
  ~id, ~property, ~value,
  1,    "A",      9,
  1,    "A",      8,
  1,    "B",      7,
  2,    "A",      6,
  2,    "B",      5
)

我的目标是将 属性 散布到列中以获得此 table:

tribble(
  ~id, ~A, ~B,
  1,  9,  7,
  1,  8,  7,
  2,  6,  5
)

idproperty 分组并添加一个键接近但留下 NA:

## almost but not quite
ex %>% 
  group_by(id, property) %>%
  mutate(key = row_number()) %>%
  spread(property, value) %>% 
  select(-key) -> X
X

给出:

     id     A     B
1     1     9     7
2     1     8    NA
3     2     6     5

我可以在最小的例子中解决这个问题,方法是将上面的每个 property 分开,删除 NA,然后通过 id:

加入
inner_join(
  na.omit(select(X, id, A)),
  na.omit(select(X, id, B))
)

但很明显,这并不能推广到任意一组属性。执行此操作的更好 tidyverse 策略是什么?

注意: 前面的几个问题说明了前半部分,例如构造 key 列以便 spread 不会失败,但看不到解决 NA 的内容。

您可以使用 fill 来自 tidyr:

library(dplyr)
library(tidyr)

ex %>% 
  group_by(id, property) %>%
  mutate(key = row_number()) %>%
  spread(property, value) %>% 
  select(-key) %>%
  group_by(id) %>%
  fill(-id)

结果:

# A tibble: 3 x 3
# Groups:   id [2]
     id     A     B
  <dbl> <dbl> <dbl>
1     1     9     7
2     1     8     7
3     2     6     5