2017-10-10 15 views
2

J'essaye de construire un code dans r qui retournera des valeurs de certaines rangées dans une colonne basée sur des valeurs des rangées dans une colonne différente.Comment extraire certaines valeurs d'une colonne en fonction des restrictions remplies dans une autre colonne?

Je plus spécifique l'ensemble de données suivant (BTM):

Date  CompanyName MarketValue BookValue BookToMarket 
31.12.87 Bure Equity 2182000  2260267  
31.01.88 Bure Equity 2102000  1950267 
29.02.88 Bure Equity 2182000  2550267 
... 
31.07.88 Bure Equity 2022000  2980267 BookValue Des87/MarketValueJuly88 
31.08.88 Bure Equity 2162000  2650267 
30.09.88 Bure Equity 2272000  2390267 BookValue Des87/MarketValueSept88 
31.10.88 Bure Equity 2122000  2650267 
30.11.88 Bure Equity 2382000  2350267 
31.12.88 
31.12.87 H&M   2182000  2650267 
31.01.88 H&M   2102000  2650267 
29.02.88 H&M   2182000  2650267 

(Ceci est seulement un petit extrait de l'ensemble de données totale, j'ai environ 1000 entreprises et 30 ans de données mensuelles pour chaque entreprise)

Je dois calculer la valeur comptable à la valeur du marché pour chaque société pour chaque date. Cependant, j'ai besoin d'utiliser la valeur comptable à partir de décembre 1987 pour calculer les valeurs de la vente au marché de juillet 1988 à juin 1989. Cela signifie que je dois comprendre que R doit comprendre que lors du calcul des valeurs de vente au période juillet 1988 - juin 1989; R doit utiliser la valeur comptable de décembre 1987 tout en utilisant la valeur marchande du mois donné. En d'autres termes, je dois coder ce qui suit: Obtenir la valeur comptable pour "Bure Equity" SI elle correspond à la date du 31.12.87. Ensuite, divisez cette valeur comptable sur la valeur marchande de "Bure Equity" à partir du juillet 88 et jusqu'au juin 89.
(Ceci doit être codé pour que cela fonctionne pour chaque entreprise et pour la période 1987-2016).

Pour ce faire, j'essayé de taper ce qui suit en r:

BTM$"Book to Market" <- ((BTM$"Book Value" | "Date"=="1987-12")/BTM$"Market Value") 

Cela me donne certaines valeurs, mais comme on s'y attendait pas les bonnes.

Idéalement, je veux une formule qui puisse me donner la valeur de la colonne "valeur comptable" SI elle correspond à décembre 87, décembre 88, décembre 89 etc. dans la colonne "Date".

De plus, je dois alors R pour diviser le livre des valeurs choisies sur les différentes valeurs du marché dans les mois suivants juillet 88 june89, 89 juillet-juin 90, etc.

Il est également important que R sépare les entreprises de chacun d'eux. Par exemple, j'ai besoin de R pour comprendre qu'il ne peut que diviser la valeur comptable de H & M en décembre 97 sur la valeur de marché en juillet 88 pour H & M (et non par exemple Bure Equity).

Est-ce que quelqu'un a une idée sur la façon dont je peux faire cela?

J'apprécie tous les conseils que je peux obtenir.

+2

Je pense que vous pouvez utiliser dplyr pour atteindre e est. Pouvez-vous poster un exemple reproductible de vos données afin que nous puissions jouer? 'dput (head (BTM))' devrait fonctionner. – csgroen

+0

Dans votre exemple, tous vos 'BookValue' sont les mêmes, pouvez-vous fournir des données où vous avez différents' BookValue'? – useR

+0

J'ai maintenant changé le BookValue's :) – Marthe

Répondre

0

Vous pouvez le faire avec dplyr et lubridate:

library(lubridate) 
library(dplyr) 

df %>% 
    mutate(Date = dmy(Date)) %>% 
    group_by(CompanyName) %>% 
    filter(month(Date) == 12) %>% 
    inner_join(df, by = "CompanyName") %>% 
    select(Date = Date.y, CompanyName, MarketValue = MarketValue.y, BookValue = BookValue.x) %>% 
    mutate(BookToMarket = BookValue/MarketValue, 
     Date = dmy(Date)) 

Résultat:

# A tibble: 12 x 5 
# Groups: CompanyName [3] 
     Date CompanyName MarketValue BookValue BookToMarket 
     <date>  <fctr>  <int>  <int>  <dbl> 
1 1987-12-31 BureEquity  2182000 2260267 1.0358694 
2 1988-01-31 BureEquity  2102000 2260267 1.0752935 
3 1988-02-29 BureEquity  2182000 2260267 1.0358694 
4 1988-07-31 BureEquity  2022000 2260267 1.1178373 
5 1988-08-31 BureEquity  2162000 2260267 1.0454519 
6 1988-09-30 BureEquity  2272000 2260267 0.9948358 
7 1988-10-31 BureEquity  2122000 2260267 1.0651588 
8 1988-11-30 BureEquity  2382000 2260267 0.9488946 
9 1988-12-31      NA  NA   NA 
10 1987-12-31   H&M  2182000 2650267 1.2146045 
11 1988-01-31   H&M  2102000 2650267 1.2608311 
12 1988-02-29   H&M  2182000 2650267 1.2146045 

données:

df = read.table(text = "Date  CompanyName MarketValue BookValue 
       31.12.87 BureEquity 2182000  2260267  
       31.01.88 BureEquity 2102000  1950267 
       29.02.88 BureEquity 2182000  2550267 
       31.07.88 BureEquity 2022000  2980267 
       31.08.88 BureEquity 2162000  2650267 
       30.09.88 BureEquity 2272000  2390267 
       31.10.88 BureEquity 2122000  2650267 
       30.11.88 BureEquity 2382000  2350267 
       31.12.88 
       31.12.87 H&M   2182000  2650267 
       31.01.88 H&M   2102000  2650267 
       29.02.88 H&M   2182000  2650267", header = TRUE, fill = TRUE) 
+0

Bonjour. Merci pour votre réponse! Cependant, cela ne semble pas fonctionner: > BTM%>% + muter (Date = dmy (date))%>% + group_by ("Nom de l'entreprise")%>% + filtre (mois (Date) == 12)%>% + inner_join (BTM, par = "Nom de l'entreprise")%>% + sélectionnez (Date = Date.y, "Nom de la société", "Valeur marchande" = MarketValue.y, "Valeur comptable "= BookValue.x)%>% + mute (BookToMarket =" valeur comptable "/" valeur marchande ", + date = dmy (date)) Erreur dans overscope_eval_next (overscope, expr): objet 'MarketValue.y 'not found En outre: Message d'avertissement: Tous les formats n'ont pas pu être analysés. Aucun format trouvé. – Marthe

+0

J'avais besoin d'ajouter un espace entre BookValue et MarketValue et ainsi de suite, car les colonnes sont appelées valeur comptable, valeur marchande et ainsi de suite. Ce fut le seul changement que j'ai apporté à votre code (plus remplacé df Avec BTM étant donné que BTM est le nom de mon dataframe), cependant, je reçois toujours un message d'erreur. Savez-vous peut-être quel pourrait être le problème? Ce – Marthe

+0

est le code que je saisis: BTM%>% muter (Date = jma (date))%>% group_by ("Nom de la société")%>% filtre (mois (date) == 12) %>% inner_join (BTM, par = "Nom de l'entreprise")%>% sélectionnez (Date = Date.y, "Nom de la société", "Valeur marchande" = MarketValue.y, "Valeur comptable" = BookValue.x) %>% mute (BookToMarket = "Valeur comptable"/"Market Value", Date = dmy (Date)) – Marthe