我正在尝试在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。
有没有人知道如何完成这项工作?
我感谢我能得到的任何提示。
答案 0 :(得分:0)
您可以使用dplyr
和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))
<强>结果:强>
# 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)