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

时间:2017-11-17 14:34:56

标签: r dplyr tidyr tidyverse

考虑最小的例子:

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

我的目标是将属性扩展到列中以获取此表:

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分割出来,删除NAs,然后加入id

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

但显然不能概括为任意属性集。这样做有什么更好的tidyverse策略?

注意:以前的几个问题与前半部分有关,例如:构建key列,以便spread不会失败,但无法查看解决NA的内容。

1 个答案:

答案 0 :(得分:5)

您可以使用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