如何将包含时间序列元素的数据框转换为R中的面板数据框?[已关闭]

b5buobof  于 2023-03-15  发布在  其他
关注(0)|答案(1)|浏览(178)

已关闭。此问题需要details or clarity。当前不接受答案。
**想要改进此问题?**添加详细信息并通过editing this post阐明问题。

3天前关闭。
这篇文章是编辑和提交审查3天前。
Improve this question
遵循以下思路:将 Dataframe (面板数据)转换为zoo,我想做同样的事情,但是相反,以便从具有时间序列元素的 Dataframe 创建面板 Dataframe 。
我试过replace库中的melt()函数,但我想不出如何得到一个干净的结果。
下面是我想做的更改的一个直观示例:
| 日期|墨西哥_价格|阿根廷_价格|墨西哥_国内生产总值|阿根廷_国内生产总值|
| - ------|- ------|- ------|- ------|- ------|
| 二零零八年|五个|十个|四百|一百|
| 二○ ○九年|七|十二|五百|一百六十|
| 二○一○年|九|十二|八百|一百九十|
因此,结果面板 Dataframe 将为:
| 国家|识别号|日期|价格|国内生产总值|
| - ------|- ------|- ------|- ------|- ------|
| 墨西哥|1个|二零零八年|五个|四百|
| 墨西哥|1个|二○ ○九年|七|五百|
| 墨西哥|1个|二○一○年|九|八百|
| 阿根廷|第二章|二零零八年|十个|一百|
| 阿根廷|第二章|二○ ○九年|十二|一百六十|
| 阿根廷|第二章|二○一○年|十二|一百九十|
谢谢你的帮助。

brvekthn

brvekthn1#

我正在根据您的需要修改代码,请检查并通知我:

library(tidyverse)
library(dplyr)

lines <- "Date  Mexico_Price    Argentina_Price     Mexico_GDP  Argentina_GDP
2008    5   10  400     100
2009    7   12  500     160
2010    9   12  800     190"

DF <- read.table(text = lines, header = TRUE)

然后你应该这样做:

DF %>%
  pivot_longer(cols = c(Mexico_Price:Argentina_Price),
               names_to = "Country_Price",
               values_to = "Price") %>%
  pivot_longer(cols = c(Mexico_GDP:Argentina_GDP),
               names_to = "Country_GDP",
               values_to = "GDP") %>%
  mutate(Country = ifelse(Country_Price == "Mexico_Price", "Mexico", "Argentina"),
         ID = ifelse(Country == "Mexico", 1, 2)) %>%
  select(Country, ID, Date, Price, GDP) %>%
  arrange(ID, Country, Date)

它将返回:

Country      ID  Date Price   GDP
   <chr>     <dbl> <int> <int> <int>
 1 Mexico        1  2008     5   400
 2 Mexico        1  2008     5   100
 3 Mexico        1  2009     7   500
 4 Mexico        1  2009     7   160
 5 Mexico        1  2010     9   800
 6 Mexico        1  2010     9   190
 7 Argentina     2  2008    10   400
 8 Argentina     2  2008    10   100
 9 Argentina     2  2009    12   500
10 Argentina     2  2009    12   160
11 Argentina     2  2010    12   800
12 Argentina     2  2010    12   190

另外,如果你有更多的列(例如国家),那么使用case_when()代替ifelse:

DF %>%
  pivot_longer(cols = c(Mexico_Price:Argentina_Price),
               names_to = "Country_Price",
               values_to = "Price") %>%
  pivot_longer(cols = c(Mexico_GDP:Argentina_GDP),
               names_to = "Country_GDP",
               values_to = "GDP") %>%
  mutate(Country = case_when(
    Country_Price == "Mexico_Price" ~ "Mexico",
    Country_Price == "Argentina_Price" ~ "Argentina"
  ),
  ID = case_when(
    Country == "Mexico" ~ 1,
    Country == "Argentina" ~ 2
  )) %>%
  select(Country, ID, Date, Price, GDP) %>%
  arrange(ID, Country, Date)

这有帮助吗?
---下面是巴勃罗修改他的问题之前我最初的建议:
你是不是想做这样的事

library(tidyverse)
library(dplyr)

Lines <- "Ctry  year   Carx   Brx
 A    2000    23     12
 A    2001    18     16
 A    2002    20     20
 A    2003    NA     18
 A    2004    24     NA
 A    2005    18     12
 B    2000    NA     22
 B    2001    NA     20
 B    2002    NA     14
 B    2003    NA     NA
 B    2004    18     NA
 B    2005    16     14   
 C    2000    NA     NA
 C    2001    NA     25
 C    2002    24     32
 C    2003    21     NA
 C    2004    NA     15
 C    2005    24     NA
"
DF <- read.table(text = Lines, header = TRUE)

DF %>%
  pivot_wider(names_from = Ctry, values_from = c(Carx,Brx))

返回如下表格:

year Carx_A Carx_B Carx_C Brx_A Brx_B Brx_C
  <int>  <int>  <int>  <int> <int> <int> <int>
1  2000     23     NA     NA    12    22    NA
2  2001     18     NA     NA    16    20    25
3  2002     20     NA     24    20    14    32
4  2003     NA     NA     21    18    NA    NA
5  2004     24     18     NA    NA    NA    15
6  2005     18     16     24    12    14    NA

相关问题