我有一个数据集,显示每个银行与此投资相关的投资和美元价值。目前数据看起来像这样。我有inv
和amt
个变量,范围从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中的等效代码是什么?
答案 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
参数并查找左侧的公共元素(inv
和amt
)以及右侧的其他元素(1
,2
,和43
)。 sep
参数表示没有分隔符(默认sep
字符为.
)。