如何融合或收集基于多列的数据框?

how to melt or gather a data frame based on multiple columns?

以下是我拥有的数据框类型和格式的示例

fnum<-c('510-1','510-2','510-3')
refcharge<-c('assault','theft','rape')
refsev<-c('F','F','F')
refclass<-c('B','B','A')
issuedch<-c('assault','robbery','sodomy')
isssev<-c('F','M','F')
issclass<-c('A','A','B')

df<-data.frame(fnum,refcharge,refsev,refclass,issuedch,isssev,issclass)
df

     fnum refcharge refsev refclass issuedch isssev issclass
1 510-1   assault      F        B  assault      F        A
2 510-2     theft      F        B  robbery      M        A
3 510-3      rape      F        A   sodomy      F        B

我希望能够 gathermelt 此数据框成为更高的数据集,使其看起来像以下格式。我提供了一个示例,说明它可能如何查找 fnum 510-2

fnum chargeoutcome charge Severity Class
510-1  refcharge   assault  F       B
510-1  issuedch    assault  F       A
510-2  refcharge   theft    F       B
510-2  issuedch    robberry M       A
510-3  refcharge   rape     F       A
510-3  issuedch    sodomy   F       B

我使用了 melt(df,id=c('fnum','refcharge','issuedch')) 但这并没有以我需要的数据帧格式提供它

我们可以使用 pivot_longer

中的 names_pattern
library(dplyr)
library(tidyr)
df %>%
  pivot_longer(cols = -fnum, names_pattern = "^(ref|iss)(.*)", 
       names_to = c('chargeoutcome', '.value')) %>% 
  mutate(charge = coalesce(as.character(charge), as.character(uedch))) %>% 
  select(-uedch) %>%
  mutate(chargeoutcome = factor(chargeoutcome, levels = c('ref', 'iss'), 
          labels = c('refcharge', 'issuedch')))
# A tibble: 6 x 5
#  fnum  chargeoutcome charge  sev   class
#  <fct> <fct>         <chr>   <fct> <fct>
#1 510-1 refcharge     assault F     B    
#2 510-1 issuedch      assault F     A    
#3 510-2 refcharge     theft   F     B    
#4 510-2 issuedch      robbery M     A    
#5 510-3 refcharge     rape    F     A    
#6 510-3 issuedch      sodomy  F     B