需要使用嵌套循环矢量化解决方案(将数据帧从长格式转换为宽格式)

时间:2014-06-01 01:16:21

标签: r for-loop vectorization

我有以下数据框,需要从长格式转换为宽格式:

symbol side price
1      A    B     1
2      A    S     2
3      B    B     3
4      C    B     4
5      B    S     5

说明:每个符号必须存在两条边B和边S的线。需要找到这些线并将它们转换为宽格式:

[symbol, first-comed side (B or S), price of side B, price of side S]

如果存在一行但缺少另一行,则将NA值设置为适当的价格值。例如,如果存在具有B侧的线,但缺少S侧,则将NA置于S侧的价格。

输出结果必须如下:

  symbol side price_B price_S
1      A    B      1      2
2      B    B      3      5
3      C    B      4     NA

对于符号A和B,我们有边A和B的线,所以我们转换它们没有NA' s。 B面是第一个然后我们只将B面放到"边"柱。对于符号C,我们只有B侧而不是S侧,所以我们将NA值放在" price_S"列。

如何对其进行矢量化?

1 个答案:

答案 0 :(得分:4)

reshape获得价格:

prices <- reshape(x, direction='wide', idvar='symbol', timevar='side', v.names='price', sep='')
prices
##   symbol priceB priceS
## 1      A      1      2
## 3      B      3      5
## 4      C      4     NA

aggregate获得第一个价格:

first <- aggregate(side ~ symbol, data=x, FUN=head, n=1)
first
##   symbol side
## 1      A    B
## 2      B    B
## 3      C    B

merge将他们放在一起:

merge(first, prices)
##   symbol side priceB priceS
## 1      A    B      1      2
## 2      B    B      3      5
## 3      C    B      4     NA