2017-10-10 69 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年的月度數據的每家公司)

我需要計算每個公司在每個日期內的賬面市值。然而,當計算1988年7月至1989年6月的賬面市值時,我需要使用1987年12月的賬面價值。這意味着我需要讓R理解在計算賬面市值時1988年7月 - 1989年6月; R需要使用1987年12月的賬面價值,同時使用給定月份的市場價值。

換句話說,我需要對以下代碼進行編碼:獲取「Bure Equity」的賬面價值,如果它對應於日期31.12.87。然後將此賬面價值從88年7月至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日等在「日期」列。

而且我當時必須具備r分割在不同的市場價值選擇的賬面值在接下來的幾個月月88 june89,89月 - 90年6月等

同樣重要的是,R公司分離從彼此。例如,我需要R理解,H & M(而不是Bure Equity)的市場價值在98年7月份只能在97年12月份將賬面價值H & M分開。

有沒有人有關於如何完成這件事的想法?

我很感激我能得到的任何提示。

+2

我認爲你可以使用dplyr實現日是。你能發佈一個可複製的數據例子,這樣我們可以玩嗎? '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 

數據:

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(Date = dmy(Date))%>% + group_by(「Company Name」)%>% + filter(month(Date) == 12)%>% + inner_join(BTM,by =「公司名稱」)%>% + select(Date = Date.y,「Company Name」,「Market Value」= MarketValue.y,「Book Value 「= BookValue.x)%> + mutate(BookToMarket =」Book Value「/」Market Value「, + Date = dmy(Date)) overscope_eval_next(overscope,expr)中的錯誤: object'MarketValue.y '未找到 另外:警告消息: 所有格式均無法解析。找不到格式。 – Marthe

+0

我需要在BookValue和MarketValue等之間添加一個空格,因爲這些列被稱爲「帳面價值」,「市場價值」等。這是我對你的代碼做的唯一修改(加上用BTM代替了df,因爲BTM是我的數據框的名稱),但是,我總是收到一條錯誤消息。你也許知道這個問題可能是什麼? – Marthe

+0

這是我在輸入的代碼: BTM%>% 突變(日期= DMY(日期))%>% GROUP_BY( 「公司名稱」)%>% 濾波器(月(日期)== 12) %>% inner_join(BTM,by =「Company Name」)%>% select(Date = Date.y,「Company Name」,「Market Value」= MarketValue.y,「Book Value」= BookValue.x) %>% 發生變異(BookToMarket =「賬面價值」 /「市場價值」, 日期=日月年(日期)) – Marthe

相關問題