2017-10-10 2 views
2

私は、ある列の特定の行の値を別の列の行の値に基づいて返すrでコードを構築しようとしています。私は、次のデータセット(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 

(これは、全データセットからほんの抜粋であり、私は約1000の企業や各企業のための月次データの30年を持っている)

各日付の各会社のBook-to-Marketの価値を計算する必要があります。しかし、1988年7月から1989年6月までの間の時価を計算する際には、1987年12月の帳簿価額を使用する必要があります。期間は1988年7月 - 1989年6月。 Rは、指定された月の市場価値を使用しながら1987年からの簿価を使用する必要があります。

言い換えれば、私は次のコードを書く必要があります。 "Bure Equity"の帳簿価額を取得した日付は31.12.87です。次に、この帳簿価額を7月88日から6月89日までの「Bure Equity」の市場価値で割ります。
(これはコード化する必要があり、各社および期間1987-2016の間で有効です。

私はRで次のように入力しようとした。このためには:

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

をこれは私にいくつかの値が得られますが、正しいものではありません予想通り。

理想的には、「日付」列に12月87日、12月88日、12月89日などに対応する「簿価」欄の値を私に与えることができる式が必要です。

さらに私は、7月89、以下ヶ月で7月88-june89を異なる市場価値に選ばれたブックの値を分割するRが必要 - Rは、会社を分けることも重要である

など6月90互いに。たとえば、1997年12月のH & Mの帳簿価額を、H & M(およびBure Equityではなく)の7月88日の市場価値で除算することしかできないことを理解するためにRが必要です。

どのように私はこれを行うことができますか?

私は得ることができるヒントをありがとう。

+2

です。再生できるようにデータの再現可能な例を投稿できますか? 'dput(head(BTM))'は動作するはずです。 – csgroen

+0

あなたの例では、あなたのすべての 'BookValue'は同じです、異なる' BookValue'を持っているところでデータを提供できますか? – useR

+0

私は今BookValueのを変更しました: – Marthe

答えて

0

あなたはdplyrlubridateでこれを行うことができます。

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)) 

結果:

# 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 

データ:私はあなたが目を達成するためにdplyr使用することができると思う

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

こんにちは。あなたの答えをありがとう!ただし、動作していないようです: > BTM%>% + mutate(日付= dmy(日))%>% + group_by( "会社名")%>% +フィルタ(月(日付) =%12)%>% + inner_join(BTM、by = "Company Name")%>% + select(Date = Date.y、 "会社名"、 "Market Value" = MarketValue.y、 "Book Value overscope_eval_next(overscope、expr)のエラー: オブジェクト 'MarketValue.y(%= BookValue.x)%> 'not found 警告メッセージ: すべての形式を解析できませんでした。フォーマットが見つかりません。 – Marthe

+0

BookValueとMarketValueの間にスペースを追加する必要がありました。列はBook Value、Market Valueなどと呼ばれていました。これは私があなたのコードに行った唯一の変更(プラス、BTMを私のデータフレームの名前であると仮定してBTMに置き換えた)ですが、私はいつもエラーメッセージを受け取ります。あなたはおそらく問題が何であるか知っていますか? – Marthe

+0

これは私が入力したコードは次のとおりです。 BTM%>% 変異させる(日= DMY(日))%>% GROUP_BY( "会社名")%>% フィルタ(月(日)== 12) %> inner_join(BTM、by = "Company Name")%>% select(Date = Date.y、 "会社名"、 "Market Value" = MarketValue.y、 "Book Value" = BookValue.x)この問題は、あなたが実際に持っているデータに関連している可能性があります。%%%mutate(BookToMarket = "Book Value"/"Market Value" Date = dmy(Date)) – Marthe

関連する問題