使用pivot_wider转换多粒度级别数据以在数据重复时创建新列

i2byvkas  于 2023-01-28  发布在  其他
关注(0)|答案(1)|浏览(132)

我创建了一个输出表,其中包括客户层信息和一些更细粒度的数据(计划层信息),因此客户信息可能会在数据中重复。以下是一个简化的示例:

client <- c('smith', 'smith', 'black', 'lucas')
address <- c('100 Main', '100 Main', '123 Elm', '222 Hill')
type <- c('medical', 'dental', 'vision', 'medical')
comp <- c(.1, .15, .12, .12)

sample <- bind_cols(client = client, address = address, type `= type, comp = comp)`

如何使用pivot_wideer()或其他dplyr函数转换数据,使每一行都是客户端,每个计划层字段显示为新列。输出如下:

client <- c('smith', 'black', 'lucas')
address <- c('100 Main', '123 Elm', '222 Hill')
type_1 <- c('medical', 'vision', 'medical')
comp_1 <- c(.1, .12, .12)
type_2 <- c('dental', 'na', 'na')
comp_2 <- c(.15, 'na','na')

sample_final <- bind_cols(client = client, address = address
                          , type_1 = type_1, comp_1 = comp_1
                          , type_2 = type_2, comp_2 = comp_2)
xdnvmnnf

xdnvmnnf1#

首先在每个客户机中创建行号,然后将行号传递给pivot_wider()中的names_from。还要注意,使用names_vary = "slowest"可以按所需顺序获得列。

library(dplyr)
library(tidyr)

sample %>%
  group_by(client) %>%
  mutate(num = row_number()) %>%
  ungroup() %>%
  pivot_wider(
    names_from = num,
    values_from = type:comp,
    names_vary = "slowest"
  )
# A tibble: 3 × 6
  client address  type_1  comp_1 type_2 comp_2
  <chr>  <chr>    <chr>    <dbl> <chr>   <dbl>
1 smith  100 Main medical   0.1  dental   0.15
2 black  123 Elm  vision    0.12 <NA>    NA   
3 lucas  222 Hill medical   0.12 <NA>    NA

相关问题