Необходимо векторизовать решение, используя вложенные циклы (преобразование фрейма данных из длинного в широкий формат)

У меня есть следующий кадр данных, и мне нужно преобразовать длинный формат в широкий:

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 отсутствует, то в цену стороны S поставьте NA.

Результаты вывода должны быть следующими:

  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».

Как его векторизовать?


person Eldar Agalarov    schedule 01.06.2014    source источник
comment
Я думал, что было довольно ясно, о чем спрашивали. Ну что ж.   -  person Matthew Lundberg    schedule 02.06.2014
comment
Я обновил свой вопрос. Надеюсь теперь понятно.   -  person Eldar Agalarov    schedule 02.06.2014


Ответы (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
person Matthew Lundberg    schedule 01.06.2014