首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在R中从宽到长,使用列的前2个字母(Y/N)作为一个id,最后4个(年份)作为第二个id

在R中从宽到长,使用列的前2个字母(Y/N)作为一个id,最后4个(年份)作为第二个id
EN

Stack Overflow用户
提问于 2022-08-03 00:24:08
回答 2查看 32关注 0票数 0

我在使用将数据从宽格式重新排列为长格式时遇到了困难, ids来自单个列。

列名如下:

Y_2022或N_2022.

我想将列名分成两部分,然后使用a) Yes/No参数作为第一个id,b)用年份作为第二个id。

下面是一个可复制的代码块:

代码语言:javascript
复制
            d = structure(list(SCRIPT = c("BC", "BC", "RC", "RC"), 
        INSTITUTE = c("BCR","BCR", "CC", "CC"), CLASS = c("BANK", "CORPORATION","RETAIL", "WHOLESALE"),
    Y_2022 = c(0.86, 3.32, 0.86, 3.35), Y_2023 = c(0.87, 0.86, 0.19, 0.25),
N_2022 = c(-0.86,0.7, 0.06, 0.06), N_2023 = c(0.86, 0.03, 0.86, 0.04)), 
    row.names = c(NA,-4L), class = c("tbl_df", "tbl", "data.frame"))

如果没有Y/N变体,我会做以下工作:

代码语言:javascript
复制
library(tidyr)

#names(d) = gsub(pattern = "Y_*", replacement = "", x = names(d))

d <- pivot_longer(d, cols=4:7, names_to = "Year", values_to = "EUR")

目前,我的数据集如下所示:

代码语言:javascript
复制
 Script| Institute  |  Class   |  Y_2022 |  Y_2023  |  N_2022  |  N_2023 

 BC    | BCR        |  Retail  |  0.86   |  0.86    |  0.86    |  0.86 
 
 RC    |  BCR       |  Retail  |  0.86   |  0.86    |  0.86    |  0.86 
  
 BC    |  CC        |  Retail  |  0.86   |  0.86    |  0.86    |  0.86  
 
 RC    |  CC        |  Retail  |  0.86   |  0.86    |  0.86    |  0.86

我需要它看起来像这样:

代码语言:javascript
复制
Script  | Institute |  Class |  Year  | Yes-No |  EUR 


BC      |  BCR      | Retail |  2022  |  Y_    |  0.86 


RC      |  BCR      | Retail |  2023  |  Y_    |  0.86 


BC      |  BCR      | Retail |  2022  |  N_    |  0.86 


RC      |  BCR      | Retail |  2023  |  N_    |  0.86
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2022-08-03 00:41:45

您可以使用pivot_longer(),然后是separate()

代码语言:javascript
复制
pivot_longer(d,-(1:3),values_to = "EUR") %>% 
  separate(name,into=c("Yes-No", "Year"), sep="_")

或者,按照Onyanbu的建议将它们组合在一起:

代码语言:javascript
复制
pivot_longer(d, -(1:3), names_to = c('Yes-No', 'Year'), names_sep = '_', values_to = 'EUR')

输出:

代码语言:javascript
复制
   SCRIPT INSTITUTE CLASS       `Yes-No` Year    EUR
   <chr>  <chr>     <chr>       <chr>    <chr> <dbl>
 1 BC     BCR       BANK        Y        2022   0.86
 2 BC     BCR       BANK        Y        2023   0.87
 3 BC     BCR       BANK        N        2022  -0.86
 4 BC     BCR       BANK        N        2023   0.86
 5 BC     BCR       CORPORATION Y        2022   3.32
 6 BC     BCR       CORPORATION Y        2023   0.86
 7 BC     BCR       CORPORATION N        2022   0.7 
 8 BC     BCR       CORPORATION N        2023   0.03
 9 RC     CC        RETAIL      Y        2022   0.86
10 RC     CC        RETAIL      Y        2023   0.19
11 RC     CC        RETAIL      N        2022   0.06
12 RC     CC        RETAIL      N        2023   0.86
13 RC     CC        WHOLESALE   Y        2022   3.35
14 RC     CC        WHOLESALE   Y        2023   0.25
15 RC     CC        WHOLESALE   N        2022   0.06
16 RC     CC        WHOLESALE   N        2023   0.04
票数 0
EN

Stack Overflow用户

发布于 2022-08-30 12:53:56

更一般

代码语言:javascript
复制
non_num_vars <- names(d)[rev(seq(1,ncol(d))[!as.logical(sapply(d, is.numeric))])]
    
    
d = pivot_longer(df, -all_of(non_num_vars), names_to = c('YN', 'Year'), names_sep = '_', values_to = 'EUR')
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/73215082

复制
相关文章

相似问题

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