如何融合或收集基于多列的数据框?
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
我希望能够 gather
或 melt
此数据框成为更高的数据集,使其看起来像以下格式。我提供了一个示例,说明它可能如何查找 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
以下是我拥有的数据框类型和格式的示例
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
我希望能够 gather
或 melt
此数据框成为更高的数据集,使其看起来像以下格式。我提供了一个示例,说明它可能如何查找 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