r - R:使用共享键和缺失数据传播 data.frame/tibble
问题描述
我有一个包含两列的表格,我想将其展开。我知道这是一个非常受欢迎且经过充分探索的主题,但是,我尝试了几种方法并没有得到我想要的。欢迎任何建议和投诉。
我的表中填满了三位女性的数据。总共有5个类别,一般来说,每个类别都充满了价值。但是缺少一些女性数据,导致整行缺失的原因 - 请注意关于 . 的Jane
缺失信息weight
。
a = data.frame(categories = c("name", "sex", "age", "weight", "high",
"name", "sex", "age", "high",
"name", "sex", "age", "weight", "high"),
values = c("Emma", "female", "32", "72", "175",
"Jane", "female", "28", "165",
"Emma", "female", "42", "63", "170"))
categories values
1 name Emma
2 sex female
3 age 32
4 weight 72
5 high 175
6 name Jane
7 sex female
8 age 28
9 high 165
10 name Emma
11 sex female
12 age 42
13 weight 63
14 high 170
我想从categories
- 列和从values
- 行获取。但是有两个主要问题:
1)密钥是共享的 - 两个 Emmas(因此我不能使用spread
or reshape
)
2)某些类别可能会丢失 - 例如简的体重(因此我不能使用pivot
or split
)
最后,我想重塑数据以获得这样的表格:
name sex age weight high
Emma female 32 72 175
Jane female 28 NA 165
Emma female 42 63 170
解决方案
假设'name'
每个条目总是存在,我们可以创建一个标识符列并使用 pivot_wider
.
library(dplyr)
a %>%
group_by(grp = cumsum(categories == 'name')) %>%
tidyr::pivot_wider(names_from = categories, values_from = values) %>%
ungroup %>%
select(-grp)
# name sex age weight high
# <chr> <chr> <chr> <chr> <chr>
#1 Emma female 32 72 175
#2 Jane female 28 NA 165
#3 Emma female 42 63 170
相同的逻辑data.table
:
library(data.table)
dcast(setDT(a), cumsum(categories == 'name')~categories, value.var = 'values')