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
)
按 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
分开,删除 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
考虑最小的例子:
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
)
按 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
分开,删除 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