首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何使用group_by将每个变量中的数据从长到宽进行转置?R

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

Stack Overflow用户
提问于 2020-04-12 09:30:13
回答 2查看 26关注 0票数 0

我有一个id变量为name的dataframe。我正在尝试找出一种方法来按名称转置数据帧中的每个变量。

我当前的df如下:

代码语言:javascript
复制
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,并且每个name的观察值都变成了它自己的列,如下所示:

代码语言:javascript
复制
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变量的每个观察值都需要成为它自己的列。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2020-04-12 09:48:24

听起来你在找gatherpivot_wider

我使用了我自己的样本数据,有两个名字:

代码语言:javascript
复制
df <- tibble(name = c('David', 'David', 'David', 'Bill', 'Bill'),
             jobtitle = c('PM', 'TPM', 'Analyst', 'Dev', 'Eng'),
             companyname = c('EOS', 'Options', NA, 'Microsoft', 'Nintendo'))

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

代码语言:javascript
复制
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获得一个很长的表单,每行一个值。

代码语言:javascript
复制
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为每个变量和索引创建一列。

代码语言:javascript
复制
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    
票数 2
EN

Stack Overflow用户

发布于 2020-04-12 09:48:01

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

代码语言:javascript
复制
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)
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/61165773

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档