2017-10-10 7 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에서 책 - 투 - 시장 가치를 계산할 때 R이 이해하도록해야합니다. 기간 7 월 1988 - 6 월 1989; R은 주어진 월의 시가를 사용하면서 1987 년부터의 장부가를 사용해야합니다.

즉, 다음을 코딩해야합니다. 31.12.87 날짜에 해당하는 경우 "Bure Equity"의 장부가를 가져옵니다. 그런 다음이 장부가를 7 월 88 일부터 89 일까지 "Bure Equity"시장 가치로 나누십시오.
(이는 각 회사 및 1987-2016 년 동안 유효하도록 코딩해야합니다).

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

이 나에게 어떤 가치를 제공하지만,하지 않을 권리들 예상대로 :이 작업을 수행하기 위해

나는 연구에 다음을 입력했습니다.

이상적으로 "Date value"열에 12 월 87 일, 12 월 88 일, 12 월 89 일 등등에 해당하는 "Book value"-column 값을 줄 수있는 공식이 필요합니다.

또한 그때 R 7 월 88 june89 년 7 월 다음 달에 89 다른 시장 가치에 선택한 책 값을 분할해야 - 6 월 90 등

R은 회사를 분리하는 것이 중요하다 서로에게서. 예를 들어 97 년 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 = "회사 이름") %> % + select (날짜 = Date.y, "회사 이름", "시가"= MarketValue.y, "장부가 "= BookValue.x) + overscope_eval_next (overscope, expr)의 오류 : + mutate (BookToMarket ="장부가 "/"시장 가격 ", + 날짜 = dmy (날짜)) object 'MarketValue.y '찾을 수 없음 경고 메시지 : 모든 형식을 구문 분석하지 못했습니다. 형식을 찾을 수 없습니다. – Marthe

+0

BookValue와 MarketValue 사이에 공백을 추가해야합니다. 열은 Book Value, Market Value 등으로 불립니다. 이것은 내가 코드에 변경 한 유일한 것입니다 (BTM을 내 데이터 프레임의 이름으로 사용하면 BTM 대신 df를 대체 할 수 있음). 그러나 항상 오류 메시지가 나타납니다. 문제가 무엇인지 알 수 있습니까? – 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", 날짜 = dmy (날짜)) – Marthe

관련 문제