对R中的多个变量重新整形数据

时间:2014-09-07 18:52:30

标签: r rstudio stata

我有一个数据集,显示每个银行与此投资相关的投资和美元价值。目前数据看起来像这样。我有invamt个变量,范围从1到43。

bankid year location inv1   amt1 inv2 amt2 ... inv43 amt43 
1          1990 NYC      AIG    2000 GM   4000     Ford  6000 

但我希望数据看起来像这样

bankid year location inv number amt
1      1990  NYC     AIG  1     2000  
1      1990  NYC     GM   2     4000
...
1      1990  NYC     Ford 43    6000  

在Stata中,我会使用此代码

reshape long inv amt, i(bankid location year) j(number)

R中的等效代码是什么?

1 个答案:

答案 0 :(得分:2)

reshape可以做到这一点。在这里,我使用您的数据的已发布子集,其中您有时间变量1,2和43:

x <- read.table(header=TRUE, text='bankid year location inv1   amt1 inv2 amt2  inv43 amt43 
1          1990 NYC      AIG    2000 GM   4000     Ford  6000 ')
x
##   bankid year location inv1 amt1 inv2 amt2 inv43 amt43
## 1      1 1990      NYC  AIG 2000   GM 4000  Ford  6000

v <- outer(c('inv', 'amt'), c(1,2,43), FUN=paste0)
v
##      [,1]   [,2]   [,3]   
## [1,] "inv1" "inv2" "inv43"
## [2,] "amt1" "amt2" "amt43"

reshape(x, direction='long', varying=c(v), sep='')
##      bankid year location time  inv  amt id
## 1.1       1 1990      NYC    1  AIG 2000  1
## 1.2       1 1990      NYC    2   GM 4000  1
## 1.43      1 1990      NYC   43 Ford 6000  1

对于您的完整表格,varying参数将为c(outer(c('inv', 'amt'), 1:43, FUN=paste0))(但由于缺少列,因此对于小示例不起作用)。

在这里,reshape推断出“时间”&#39;变量通过检查varying参数并查找左侧的公共元素(invamt)以及右侧的其他元素(12,和43)。 sep参数表示没有分隔符(默认sep字符为.)。