考虑最小的例子:
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
)
按id
和property
分组并添加密钥会关闭,但会留下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
的内容。
答案 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