2012-06-25 8 views
1

Я работаю над R data.frame, который сделан из дивидендов по акциям в год (у меня есть 60 акций в столбцах и обычный календарь в строках). Когда выплачивается дивиденд, у меня есть эта цифра, и в противном случае есть NA.R Сортировка данных по дате

В принципе, вот как мой data.frame выглядит

  BARC LN  BARN SE BAS GY BATS LN 
1999-01-01  0.26  NA  NA 
1999-01-02  NA  0.56  0.35  NA 
1999-01-03  NA  NA  NA  NA 
2000-01-04  NA  NA  0.40  NA 
1999-01-05  0.23  0.28  NA  NA 
2001-01-06  NA  NA  NA  NA 
2001-01-07  0.85  NA  0.15  NA 

Я хотел бы получить сумму дивидендов, выплаченных в год за каждую акцию, чтобы вычислить соотношение доходности дивидендов и, наконец, получить данные , как показано ниже:

  BARC LN BARN SE BAS GY BATS LN 
    1999  NA  NA  NA  NA 
    2000  NA  NA  NA  NA 
    2001  NA  NA  NA  NA 

Как я могу это сделать?

+1

Что вы пробовали? Похоже, что ваши даты «row.names»?вы можете использовать 'dput' для публикации подмножества ваших фактических данных. Это значительно облегчит вам правильный ответ. – Justin

+0

вот что я пробовал, но он не дает мне дивидендов по акциям, поскольку у меня есть только даты: лет <-as.POSIXlt (Даты) $ year + 1900 Div [, 1] [который (лет == 2000)] – marino89

+0

извините, Div - это data.frame, который содержит все мои данные – marino89

ответ

2

Таким образом, предполагая, что ваши данные в data.frame, как тот, который вы уже написали выше под названием div:

div <- structure(list(barc.ln = c(0.26, NA, NA, NA, 0.23, NA, 0.85), 
    barn.se = c(NA, 0.56, NA, NA, 0.28, NA, NA), bas.gy = c(NA, 
    0.35, NA, 0.4, NA, NA, 0.15), bats.ln = c(NA, NA, NA, NA, 
    NA, NA, NA)), .Names = c("barc.ln", "barn.se", "bas.gy", 
"bats.ln"), row.names = c("1999-01-01", "1999-01-02", "1999-01-03", 
"2000-01-04", "1999-01-05", "2001-01-06", "2001-01-07"), class = "data.frame") 

так же, как вы сделали вы можете извлечь года с вашего row.names:

div$years <- as.POSIXlt(row.names(div))$year + 1900 

Пакеты plyr и reshape2 хорошо работают здесь, и я считаю, что код особенно ясен. В частности, я буду использовать melt сделать длинные данные, а затем ddply разделить на группы и sum дивиденды:

library(plyr) 
library(reshape2) 
div.melt <- melt(div, id.vars='years') 
div.sum <- ddply(div.melt, 
       .(years, variable), 
       summarise, 
       dividend = sum(value, na.rm=TRUE)) 

> div.sum 
years variable dividend 
1 1999 barc.ln  0.49 
2 1999 barn.se  0.84 
3 1999 bas.gy  0.35 
4 1999 bats.ln  0.00 
5 2000 barc.ln  0.00 
6 2000 barn.se  0.00 
7 2000 bas.gy  0.40 
8 2000 bats.ln  0.00 
9 2001 barc.ln  0.85 
10 2001 barn.se  0.00 
11 2001 bas.gy  0.15 
12 2001 bats.ln  0.00 
> 

вы можете использовать другую функцию от reshape2 называется cast для форматирования данных «широкий»:

> dcast(div.sum, years ~ variable, value.var='dividend') 
    years barc.ln barn.se bas.gy bats.ln 
1 1999 0.49 0.84 0.35  0 
2 2000 0.00 0.00 0.40  0 
3 2001 0.85 0.00 0.15  0 
> 
+0

Эта функция не работает: divends.sum <-ddply (divends.melt,. (Years, variable), sumize, divend = sum (значение, na.rm = TRUE)), а сообщение erro: eero in sum (значение, na.rm = TRUE): «type» (символ) неверно ..... – marino89

+0

@ user1474263 он работает, если вы используете данные Я предусмотрел. Если вы используете функцию 'dput', чтобы дать нам воспроизводимую копию вашего кода, я могу помочь дальше. Ошибка указывает на то, что вы пытаетесь вычислить сумму символьного вектора, что, конечно, невозможно. Но я не могу помочь отлаживать, не видя некоторые ваши данные в удобном для использования формате. – Justin

1

Я думаю, вы можете сделать это довольно легко используя(). Вот как я это сделал. Я поместил каждый блок вместе с объяснением ниже каждого блока.

dividends <- data.frame(barc_ln=c(0.26,NA,NA,NA,0.23,NA,0.85), 
         barn_se=c(NA,0.56,NA,NA,0.28,NA,NA), 
         bas_gy=c(NA,0.35,NA,0.40,NA,NA,0.15), 
         bats_ln=c(NA,NA,NA,NA,NA,NA,NA), 
         row.names=c("1999-01-01","1999-01-02","1999-01-03","2000-01-04","1999-01-05","2001-01-06","2001-01-07")) 

Это просто создает исходный кадр данных, который вы дали.

dividends[,"dates"] <- as.Date(row.names(dividends)) 
dividends <- dividends[order(dividends[,"dates"]),] 
dividends[,"year"] <- format(dividends$dates,"%Y") 

Это берет даты имени строки, а затем превращает их в новый столбец («даты») в фрейме данных. Затем мы заказываем фрейм данных (необязательно, но я нахожу его более интуитивным) по дате и извлекаю год (как символ, помните), используя формат.

div_output <- data.frame(row.names=unique(dividends$year)) 

Далее я создаю кадр выходных данных, который будет принимать данные. Я использую функцию unique() для переменной года, чтобы получить уникальный вектор лет. Они уже заказаны (одно преимущество заказа кадра данных).

for(x in 1:4) { 
    div_output[,x] <- by(dividends[,x],INDICES=dividends$year,FUN=sum,na.rm=TRUE) 
} 
names(div_output) <- names(dividends)[1:4] 

Используя простой цикл, мы просто проходим через каждый из столбцов и применяем функцию by(). Переменная - столбец, индексы - год, и мы просто используем функцию sum. Я отмечаю na.rm = TRUE, так что вместо NA вы получаете фактические данные.

print(div_output) 

    barc_ln barn_se bas_gy bats_ln 
1999 0.49 0.84 0.35  0 
2000 0.00 0.00 0.40  0 
2001 0.85 0.00 0.15  0 

И есть выход, который я получаю.

Смежные вопросы