如何使用 group_by 将每个变量中的数据从长转置到宽? R

How can I transpose data in each variable from long to wide using group_by? R

我有一个 id 变量 name 的数据框。我试图找出一种方法来按名称转置数据框中的每个变量。

我目前的df如下:

name   jobtitle companyname datesemployed empduration joblocation jobdescrip 

1 David… Project… EOS IT Man… Aug 2018 – P… 1 yr 9 mos  San Franci… Coordinati…
2 David… Technic… Options Te… Sep 2017 – J… 5 mos       Belfast, U… Working wi…
3 David… Data An… NA          Jan 2018 – J… 6 mos       Belfast, U… Working wi…

但是,我想要一个数据框,其中只有一行名称,并且名称的每个观察值都成为它自己的列,如下所示:

name   jobtitle_1 companyname_1 datesemployed_1 empduration_1 joblocation_1 jobdescrip_1 job_title2 companyname_2 datesemployed_2 empduration_2 joblocation_2 jobdescrip_2

1 David… Project… EOS IT Man… Aug 2018 – P… 1 yr 9 mos  San Franci… Coordinati… Technic… Options Te… Sep 2017 – J… 5 mos       Belfast, U… Working wi…

我过去使用过 gather_bymelt 这样的命令来从长到宽重塑,但在这种情况下,我不确定如何应用它,因为每次观察id 变量需要成为它自己的列。

以长格式获取数据,创建一个唯一的列标识符并将其恢复为宽格式。

library(dplyr)
library(tidyr)

df %>%
  pivot_longer(cols = -name, names_to = 'col') %>%
  group_by(name, col) %>%
  mutate(row = row_number()) %>%
  pivot_wider(names_from = c(col, row), values_from = value)

听起来您正在寻找 gather and pivot_wider

我使用了我自己的示例数据和两个名称:

df <- tibble(name = c('David', 'David', 'David', 'Bill', 'Bill'),
             jobtitle = c('PM', 'TPM', 'Analyst', 'Dev', 'Eng'),
             companyname = c('EOS', 'Options', NA, 'Microsoft', 'Nintendo'))

首先添加一个索引列,以区分每个名字的不同位置。

indexed <- df %>%
  group_by(name) %>%
  mutate(.index = row_number())
indexed
#   name  jobtitle companyname .index
#   <chr> <chr>    <chr>        <int>
# 1 David PM       EOS              1
# 2 David TPM      Options          2
# 3 David Analyst  NA               3
# 4 Bill  Dev      Microsoft        1
# 5 Bill  Eng      Nintendo         2

然后可以使用 gather 得到一个长表格,每行一个值。

gathered <- indexed %>% gather('var', 'val', -c(name, .index))
gathered
#    name  .index var         val      
#    <chr>  <int> <chr>       <chr>    
#  1 David      1 jobtitle    PM       
#  2 David      2 jobtitle    TPM      
#  3 David      3 jobtitle    Analyst  
#  4 Bill       1 jobtitle    Dev      
#  5 Bill       2 jobtitle    Eng      
#  6 David      1 companyname EOS      
#  7 David      2 companyname Options  
#  8 David      3 companyname NA       
#  9 Bill       1 companyname Microsoft
# 10 Bill       2 companyname Nintendo 

现在pivot_wider可用于为每个变量和索引创建一个列。

gathered %>% pivot_wider(names_from = c(var, .index), values_from = val)
#   name  jobtitle_1 jobtitle_2 jobtitle_3 companyname_1 companyname_2 companyname_3
#   <chr> <chr>      <chr>      <chr>      <chr>         <chr>         <chr>        
# 1 David PM         TPM        Analyst    EOS           Options       NA           
# 2 Bill  Dev        Eng        NA         Microsoft     Nintendo      NA