如何重塑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
代码解释:
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
- 然后将此数据帧传递给
pivot_wider
,以根据列 type
中的值再次使数据帧变宽。因此 type
中的每个不同值都成为一个单独的列,并且相应的 amount
值取自 amount
列。这给出了最终所需的输出。
我有包含以下列的数据集: 公司名称、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
代码解释:
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
- 然后将此数据帧传递给
pivot_wider
,以根据列type
中的值再次使数据帧变宽。因此type
中的每个不同值都成为一个单独的列,并且相应的amount
值取自amount
列。这给出了最终所需的输出。