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

问题描述 投票:0回答:2

我有一个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变量的每次观察都需要变成它自己的专栏。

r reshape
2个回答
1
投票

听起来您正在寻找gatherpivot_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    

1
投票

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

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)
© www.soinside.com 2019 - 2024. All rights reserved.