首页 > 解决方案 > 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(因此我不能使用spreador reshape

2)某些类别可能会丢失 - 例如简的体重(因此我不能使用pivotor split

最后,我想重塑数据以获得这样的表格:

     name  sex    age  weight  high
     Emma  female 32   72      175
     Jane  female 28   NA      165
     Emma  female 42   63      170

标签: rdataframereshapetidyr

解决方案


假设'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')

推荐阅读