如何根据另一列中满足的限制从一列中提取某些值?

时间:2017-10-10 14:01:20

标签: r rows

我正在尝试在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年的月度数据)

我需要计算每个日期内每家公司的账面价值。但是,我需要使用1987年12月计算从1988年7月到1989年6月的按市值计算的账面价值。这意味着我需要让R了解在计算出市值时的价值。 1988年7月 - 1989年6月; R需要使用1987年12月的账面价值,同时使用给定月份的市场价值。

换句话说,我需要编写以下代码:获取“Bure Equity”的账面价值,如果它对应于日期31.12.87。然后将该账面价值从88年7月到89年6月分为“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在接下来的几个月中分别选择不同市场价值的账面价值7月88日 - 6月89日,7月89日 - 6月90日等。

R将公司彼此分开也很重要。例如,我需要R来理解它只能将H&amp; M在12月份97的账面价值除以H&amp; M(而不是Bure Equity)的市值88。

有没有人知道如何完成这项工作?

我感谢我能得到的任何提示。

1 个答案:

答案 0 :(得分: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)