【问题标题】:Need to vectorize solution that using nested loops (transform data frame from long to wide format)需要矢量化使用嵌套循环的解决方案(将数据帧从长格式转换为宽格式)
【发布时间】:2014-06-01 01:16:20
【问题描述】:

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

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 的情况下转换它们。 B 面是第一个顺序,然后我们只将 B 面放在“侧”列。对于符号 C,我们只有 B 面,但没有 S 面,因此我们将 NA 值放入“price_S”列。

如何矢量化?

【问题讨论】:

  • 我认为很清楚要问什么。哦,好吧。
  • 我更新了我的问题。希望现在清楚了。

标签: r for-loop vectorization


【解决方案1】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-10-22
    • 1970-01-01
    • 2021-10-08
    相关资源
    最近更新 更多