在R中将垂直数据转换为水平格式

时间:2015-08-30 19:51:16

标签: r

这是一个概念性问题。我在SQL Express数据库中有数据,我通过ODBC包加载到R中。数据格式为:

名称,代码,2015年1月1日起的天数,收盘价。

The main company, tmc, 1, 12
The xyz company, xyz, 1, 233
The one company, toc, 1, 56
The two company, ttc, 1, 88

The main company,tmc, 2, 11.5
The xyz company, xyz, 2, 232
The one Company, toc, 2, 59
The two company, ttc, 2, 89

我的问题是:是否有一个R包可以将数据从垂直格式转换为水平格式?即

名称,符号,价格 Lag1 ,价格 Lag2

The main company, tmc, 12, 11.5
The xyz company, xyz, 233, 232
The one company, toc, 56,59
The two company, ttc, 88,89

或者我应该尝试使用SQL代码执行此操作吗?

1 个答案:

答案 0 :(得分:3)

我们可以使用dcast中的reshape2spread中的tidyr。在重新整形之前,最好将带有空格的冗长列名更改为无空格列名。我们在value.var中的dcast中指定了值列。

library(reshape2)
colnames(df1)[3:4] <- c('numberofdays', 'closing_price')
dcast(df1, name+symbol~paste0('Lag', numberofdays), 
                  value.var='closing_price')
#              name symbol Lag1  Lag2
#1 The main company    tmc   12  11.5
#2  The one company    toc   56  59.0
#3  The two company    ttc   88  89.0
#4  The xyz company    xyz  233 232.0

使用dplyr/tidyr的类似选项是mutate&#39; numberofdays&#39;通过paste延迟&#39;字符串并转换“长”字符串。格式为&#39;宽&#39;与`传播。

library(dplyr)
library(tidyr)
df1 %>%
    mutate(numberofdays=paste0('Lag', numberofdays)) %>%
    spread(numberofdays, closing_price)