如何重塑R中的数据?

How to reshape the data in R?

我有包含以下列的数据集: 公司名称、ISIN、Profit2008、Profit2009、Profit2010、Profitf2008、Profitf2009、Profitf2010、Sales2008、Sales2008、Sales2009、Sales2010、Salesf2008、Salesf2009、Salesf2010。

CName ISIN Profit2008 Profit2009 Profit2010 Profitf2008 Profitf2009 Profitf2010 Sales2008 Sales2009 Sales2010 Salesf2008 Salesf2009 Salesf2010
Name1 123  34500       4000      4043       92407        127138     150449       202926    2000      34500    34500       34500        34500       
Name2 456  50000       2000      1000       33588        34116      33105        33265     44545     4000      4000       4000         4000     

基本上,数据集是针对 2008-2010 日历年和 2008-2010 财政年度期间的数据集。 有没有办法让它看起来像这样: 公司名称、ISIN、年份、利润、销售额

我希望它看起来像这样:

CName   ISIN Year     Profit  Sales 
Name1   123  2008     34500   202926    
Name1   123  2009     4000    2000      
Name1   123  2010     4043    34500    
Name1   123  f2008    92407   34500       
Name1   123  f2009    127138  34500        
Name1   123  f2010    150449  34500        
Name2   456  2008     
Name2   456  2009     
Name2   456  2010
Name2   456  f2008
Name2   456  f2009
Name2   456  f2010(etc)

感谢任何帮助。谢谢!

使用 dplyr:

library(dplyr)
library(tidyr)
df = df %>% 
   pivot_longer(cols = -c(1,2),
                           names_to = c('type', 'year'),
                           names_pattern = "([A-Za-z]+)(\d+)",
                           values_to = 'amount') %>%
   pivot_wider(names_from = 'type', values_from = 'amount')

产生以下输出:

df
# A tibble: 6 x 7
  CName  ISIN year  Profit Profitf  Sales Salesf
  <fct> <int> <chr>  <int>   <int>  <int>  <int>
1 Name1   123 2008   34500   92407 202926  34500
2 Name1   123 2009    4000  127138   2000  34500
3 Name1   123 2010    4043  150449  34500  34500
4 Name2   456 2008   50000   33588  33265   4000
5 Name2   456 2009    2000   34116  44545   4000
6 Name2   456 2010    1000   33105   4000   4000

代码解释:

  1. pivot_longer用来很好的把数据由宽变长。除第一列和第二列外,其他列名都转换为type列下的行名,各自的值放在amount列下。然后使用 names_pattern 参数拆分 type 列下的值以提取年份并放置在年份列下。作为输出,您将获得以下内容:
# A tibble: 24 x 5
   CName  ISIN type    year  amount
   <fct> <int> <chr>   <chr>  <int>
 1 Name1   123 Profit  2008   34500
 2 Name1   123 Profit  2009    4000
 3 Name1   123 Profit  2010    4043
 4 Name1   123 Profitf 2008   92407
 5 Name1   123 Profitf 2009  127138
 6 Name1   123 Profitf 2010  150449
 7 Name1   123 Sales   2008  202926
 8 Name1   123 Sales   2009    2000
 9 Name1   123 Sales   2010   34500
10 Name1   123 Salesf  2008   34500
# ... with 14 more rows
  1. 然后将此数据帧传递给 pivot_wider,以根据列 type 中的值再次使数据帧变宽。因此 type 中的每个不同值都成为一个单独的列,并且相应的 amount 值取自 amount 列。这给出了最终所需的输出。