2017-10-10 41 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

相关问题