我有以下数据框,需要从长格式转换为宽格式:
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"列。
如何对其进行矢量化?
答案 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