2015-01-24 4 views
1

저는 단기간에 R 학습을 시작했습니다. 나는 내가 필요로두 날짜 사이의 행을 데이터 프레임에 생성하십시오.

Name  stDte  edDte 
A 2010-05-01 2014-12-01 
B 2013-06-01 2014-02-01 

는 내가 rbind하지만 난과 함께 대한 루프 '에 대한'는의 조합을 사용하는 방법에 대해 생각하고이

Name Dte 
A  2010-05-01 
A  2010-06-01 
A  2010-07-01 
... 
A  2014-12-01 
B  2013-06-01 
B  2013-07-01 
... 
B  2014-02-01 

같은 테이블로 변환하려면 다음 표를 가지고 그것에 대해 어떻게해야할지 모르겠다. 그렇게하는 방법에 대한 제안을 부탁드립니다. 지침에 미리 감사드립니다.

+0

에 오신 것을 환영합니다 SO에 있습니다. 시도해 봤어? –

+0

예, Richard Scriven의 data.table 접근 방식은 제가 필요로하는 것과 정확히 같습니다. 이전에 행을 집계하는 데만 사용 했으므로 seq (stDte, edDte, by = 'month'), by = 'Name']을 사용하여 테이블에 새 행을 추가하는 방법을 생각하지 않았습니다. 이것은 매우 빠른 응답으로 훌륭한 포럼입니다. 나는 여기서 많은 것을 배울 것입니다. – Keong

답변

3

이 답변에서는 그렇지 않다고 말하지 않으므로 stDteedDte 열이 모두 "날짜"클래스라고 가정합니다. 기본 R에서

당신은 rep.int()와 함께 새로운 Name 열을 생성 한 후 함께 새로운 데이터 프레임을 가지고 다음 날짜의 순서를 만들 data.frameMap()을 사용할 수 있습니다.

M <- Map(seq, df$stDte, df$edDte, by = "month") 
df2 <- data.frame(
    Name = rep.int(df$Name, vapply(M, length, 1L)), 
    Dte = do.call(c, M) 
)  
str(df2) 
# 'data.frame': 65 obs. of 2 variables: 
# $ Name: Factor w/ 2 levels "A","B": 1 1 1 1 1 1 1 1 1 1 ... 
# $ Dte : Date, format: "2010-05-01" "2010-06-01" ... 
head(df2, 3) 
# Name  Dte 
# 1 A 2010-05-01 
# 2 A 2010-06-01 
# 3 A 2010-07-01 
tail(df2, 3) 
# Name  Dte 
# 63 B 2013-12-01 
# 64 B 2014-01-01 
# 65 B 2014-02-01 

아니면 data.table 패키지를 사용하고

library(data.table) 
setDT(df)[, .(Dte = seq(stDte, edDte, by = "month")), by = Name] 
2

당신은 각 행에 대해 dataframes의 시리즈를 구축하고 그들을 함께 rbind cn을 할 수 있습니다. dataframe 함수의 인수 재활용 속성은 필요에 '이름'등의 값을 여러 번 반복 할 것이다 :

do.call(rbind, 
     lapply(seq(nrow(dat)), function(x){ 
      data.frame(Name=dat[x,"Name"], 
      Dte=seq(as.Date(dat[x,"stDte"]), 
        as.Date(dat[x,"edDte"]) ,by="month")) })) 
2
library(plyr) 
ddply(df, .(Name), summarise, Dte = seq(as.Date(stDte), as.Date(edDte), by = "month")) 
    Name  Dte 
1  A 2010-05-01 
2  A 2010-06-01 
3  A 2010-07-01 
4  A 2010-08-01 
5  A 2010-09-01 
6  A 2010-10-01 
7  A 2010-11-01 
8  A 2010-12-01 
9  A 2011-01-01 
10 A 2011-02-01 
11 A 2011-03-01 
12 A 2011-04-01 
13 A 2011-05-01 
14 A 2011-06-01 
15 A 2011-07-01 
16 A 2011-08-01 
17 A 2011-09-01 
18 A 2011-10-01 
19 A 2011-11-01 
20 A 2011-12-01 
21 A 2012-01-01 
22 A 2012-02-01 
23 A 2012-03-01 
24 A 2012-04-01 
25 A 2012-05-01 
26 A 2012-06-01 
27 A 2012-07-01 
28 A 2012-08-01 
29 A 2012-09-01 
30 A 2012-10-01 
31 A 2012-11-01 
32 A 2012-12-01 
33 A 2013-01-01 
34 A 2013-02-01 
35 A 2013-03-01 
36 A 2013-04-01 
37 A 2013-05-01 
38 A 2013-06-01 
39 A 2013-07-01 
40 A 2013-08-01 
41 A 2013-09-01 
42 A 2013-10-01 
43 A 2013-11-01 
44 A 2013-12-01 
45 A 2014-01-01 
46 A 2014-02-01 
47 A 2014-03-01 
48 A 2014-04-01 
49 A 2014-05-01 
50 A 2014-06-01 
51 A 2014-07-01 
52 A 2014-08-01 
53 A 2014-09-01 
54 A 2014-10-01 
55 A 2014-11-01 
56 A 2014-12-01 
57 B 2013-06-01 
58 B 2013-07-01 
59 B 2013-08-01 
60 B 2013-09-01 
61 B 2013-10-01 
62 B 2013-11-01 
63 B 2013-12-01 
64 B 2014-01-01 
65 B 2014-02-01 
관련 문제