2017-05-16 3 views
1

여러 주식에 대한 연간 재무 데이터가 있습니다.tibble에서 목록의 하위 집합을 가져 오는 방법

library(tidyverse) 
library(lubridate) 

factors.subset.raw = structure(list(
    sec_id = c(1572L, 1572L, 1572L, 1572L, 1572L, 1572L, 1572L, 1572L, 1572L, 1572L, 1572L, 1572L, 1572L, 1572L, 1572L, 1572L, 1572L, 1572L, 1572L, 1572L, 1572L, 1572L, 1676L, 1676L, 1676L, 1676L, 1676L, 1676L, 1676L, 1676L, 1676L, 1676L, 1676L, 1676L, 1676L, 1676L, 1676L, 1676L, 1676L, 1572L, 1572L, 1572L, 1572L, 1572L, 1572L, 1572L, 1572L, 1572L, 1572L, 1572L, 1572L, 1572L, 1572L, 1572L, 1572L, 1572L, 1572L, 1572L, 1572L, 1572L, 1572L, 1676L, 1676L, 1676L, 1676L, 1676L, 1676L, 1676L, 1676L, 1676L, 1676L, 1676L, 1676L, 1676L, 1676L, 1676L, 1676L, 1676L), 
    metric = c("EPS_GROWTH", "EPS_GROWTH", "EPS_GROWTH", "EPS_GROWTH", "EPS_GROWTH", "EPS_GROWTH", "EPS_GROWTH", "EPS_GROWTH", "EPS_GROWTH", "EPS_GROWTH", "EPS_GROWTH", "EPS_GROWTH", "EPS_GROWTH", "EPS_GROWTH", "EPS_GROWTH", "EPS_GROWTH", "EPS_GROWTH", "EPS_GROWTH", "EPS_GROWTH", "EPS_GROWTH", "EPS_GROWTH", "EPS_GROWTH", "EPS_GROWTH", "EPS_GROWTH", "EPS_GROWTH", "EPS_GROWTH", "EPS_GROWTH", "EPS_GROWTH", "EPS_GROWTH", "EPS_GROWTH", "EPS_GROWTH", "EPS_GROWTH", "EPS_GROWTH", "EPS_GROWTH", "EPS_GROWTH", "EPS_GROWTH", "EPS_GROWTH", "EPS_GROWTH", "EPS_GROWTH", "ND_EQUITY", "ND_EQUITY", "ND_EQUITY", "ND_EQUITY", "ND_EQUITY", "ND_EQUITY", "ND_EQUITY", "ND_EQUITY", "ND_EQUITY", "ND_EQUITY", "ND_EQUITY", "ND_EQUITY", "ND_EQUITY", "ND_EQUITY", "ND_EQUITY", "ND_EQUITY", "ND_EQUITY", "ND_EQUITY", "ND_EQUITY", "ND_EQUITY", "ND_EQUITY", "ND_EQUITY", "ND_EQUITY", "ND_EQUITY", "ND_EQUITY", "ND_EQUITY", "ND_EQUITY", "ND_EQUITY", "ND_EQUITY", "ND_EQUITY", "ND_EQUITY", "ND_EQUITY", "ND_EQUITY", "ND_EQUITY", "ND_EQUITY", "ND_EQUITY", "ND_EQUITY", "ND_EQUITY", "ND_EQUITY"), 
    date = structure(c(9464, 9829, 10193, 10560, 10925, 11291, 11656, 12020, 12384, 12752, 13117, 13482, 13847, 14211, 14578, 14943, 15308, 15674, 16038, 16402, 16769, 17135, 9342, 9708, 10073, 10438, 10802, 11200, 11565, 13756, 14120, 14487, 14852, 15217, 15583, 15947, 16311, 16678, 17044, 9464, 9829, 10193, 10560, 10925, 11291, 11656, 12020, 12384, 12752, 13117, 13482, 13847, 14211, 14578, 14943, 15308, 15674, 16038, 16402, 16769, 17135, 9342, 9708, 10073, 10438, 10802, 11200, 11565, 13756, 14120, 14487, 14852, 15217, 15583, 15947, 16311, 16678, 17044), 
    class = "Date"), value = c(0.250468, 0.091548, -0.100863, 0.058375, 0.24784, 0.178765, 0.099276, 0.25472, -0.033291, 0.124165, 0.050947, 0.243008, 0.1205, -0.239625, -0.231221, 0.365649, 0.163779, 0.024976, 0.08388, 0.154777, 0.016473, -0.272928, -0.018711, -0.162076, -0.599241, -4.071504, -0.37761, 1.694085, 0.045113, 0.329818, 0.199564, -0.616418, 1.164773, 0.877078, -0.325099, -0.294199, 0.272016, -0.706077, -2.57027, 4.500261, 4.734375, 4.090376, 3.322846, 3.640895, 4.645253, 4.783054, 3.946184, 3.847828, 4.077601, 4.778736, 5.453883, 5.14355, 5.084551, 3.370378, 3.076065, 2.812879, 2.87688, 2.430692, 3.029766, 3.062665, 3.349906, 0.396299, 0.60174, 0.527478, 1.048755, 1.136417, 0.668333, 0.523115, 0.259175, 0.164024, 0.118469, 0.061141, 0.096251, 0.346829, 0.401832, 0.300988, 0.344943, 0.432505)), 
    row.names = c(NA, -78L), class = c("tbl_df", "tbl", "data.frame"), .Names = c("sec_id", "metric", "date", "value")) 

factors.subset.monthly = factors.subset.raw %>% 
    group_by(sec_id, metric) %>% 
    mutate(date = ceiling_date(date, 'month')) %>% 
    mutate(date = map2(date, lead(date - 1, default = today()), seq, by = 'month')) 

지금은 위의에 %>% unnest() %>% mutate(date = date - 1)를 추가하기에 충분 : 나는 an answer to this question I'd asked earlier에 감사를 월별 데이터가 될 그것을 밖으로 날려 필요하고, 나는 날짜의 목록date 열을 돌연변이 포함하는 솔루션을 내 연간 데이터를 월별로 변환하고 모든 날짜는 월말로 변환합니다.

데이터에 큰 차이가 있으면 내 문제가 발생합니다. 이런 일이 생기면, 나는 단지 18 개월 만에 채우기를 원합니다.

나는 date 컬럼을 잘라내는 파이프를 추가하려고 시도했지만, 지금까지는 그것을 파악하지 못했습니다. 이 작은 보석은 나에게 예를 들어 호환되지 않는 크기의 오류를 제공합니다

factors.subset.monthly %>% 
    mutate(count.date = as.numeric(lapply(date, length))) %>% 
    mutate(count.cutoff = ifelse(count.date <= 18, count.date, 18)) %>% 
    mutate(date = date[1:count.cutoff]) 
당신은 목록에 열을 반복 map/ lapply를 사용하는,하지만 당신은 단순히 18 명 관찰로 제한하는 head를 사용하여 필요

답변

1

:

library(tidyverse) 
library(lubridate) 

df <- factors.subset.monthly %>% mutate(date = map(date, head, 18)) 

any(lengths(factors.subset.monthly$date) > 18) 
#> [1] TRUE 
any(lengths(df$date) > 18) 
#> [1] FALSE 

당신이 factors.subset.monthly 할 때 당신은 또한 단지 head을 포함 할 수있다 :

factors.subset.raw %>% 
    group_by(sec_id, metric) %>% 
    mutate(date = ceiling_date(date, 'month'), 
      date = map2(date, lead(date - 1, default = today()), 
         ~head(seq(.x, .y, by = 'month'), 18))) 

to 매개 변수의 시작 날짜를 기준으로 최소 목표 시간 인 seq을 사용할 수도 있지만 18 개월을 추가하는 것은 불규칙한 길이 때문에 다소 어려울 수 있습니다.

관련 문제