将数据重塑为面板形式

时间:2015-10-21 07:50:15

标签: r csv format

我有数据,其中对象名称是变量名称,如EPSProfit等(大约25个这样的不同对象)

数据排列如下:

EPS <- read.table(text = "
Year    Microsoft   Facebook
2001    12          20
2002    15          23
2003    16          19
", header = TRUE)

Profit <- read.table(text = "
Year    Microsoft   Facebook
2001    15          36
2002    19          40
2003    25          45
", header = TRUE)

我想要这样的输出:

Year Co_Name   EPS Profit
2001 Microsoft 12  15
2002 Microsoft 15  19
2003 Microsoft 16  25
2001 Facebook  20  36
2002 Facebook  23  40
2003 Facebook  19  45

怎么做?有没有办法将所有变量的数据排列为单个对象?每个变量的数据都从一个csv文件导入到R中,如EPS.csv,Profit.csv等。有没有办法从导入创建循环到以所需格式排列数据?

2 个答案:

答案 0 :(得分:3)

我们可以在list中获取数据集。如果我们已经创建了'EPS','利润'作为对象,请使用mget来获取list中的内容,使用rbindlist转换为单个data.table,melt改为long格式并使用dcast将其重新整理为“广角”。

library(data.table)#v1.9.6+
DT <- rbindlist(mget(c('EPS', 'Profit')), idcol=TRUE)
DT1 <- dcast(melt(rbindlist(mget(c('EPS', 'Profit')), idcol=TRUE),
           id.var=c('.id', 'Year'), variable.name='Co_Name'), 
           Year+Co_Name~.id, value.var='value')
DT1
#   Year   Co_Name EPS Profit
#1: 2001 Microsoft  12     15
#2: 2001  Facebook  20     36
#3: 2002 Microsoft  15     19
#4: 2002  Facebook  23     40
#5: 2003 Microsoft  16     25
#6: 2003  Facebook  19     45

如果我们需要安排,请使用order

DT1[order(factor(Co_Name, levels=unique(Co_Name)))]

答案 1 :(得分:3)

为了好玩,我们也可以使用dplyrtidyrpurrr获得相同的结果。

library(dplyr)
library(tidyr)
library(readr)
library(purrr)

list_of_csv <- list.files(path = ".", pattern = ".csv", full.names = TRUE)
file_name <- gsub(".csv", "", basename(list_of_csv))

list_of_csv %>%
  map(~ read_csv(.)) %>%
  map(~ gather(data = ., key = co_name, value = value, -year)) %>%
  reduce(inner_join, by = c("year", "co_name")) %>%
  setNames(., c("year", "co_name", file_name))
## Source: local data frame [6 x 4]

##    year   co_name   eps profit
##   (int)    (fctr) (int)  (int)
## 1  2001 microsoft    12     15
## 2  2002 microsoft    15     19
## 3  2003 microsoft    16     25
## 4  2001  facebook    20     36
## 5  2002  facebook    23     40
## 6  2003  facebook    19     45