2017-09-21 2 views
1

날짜에 경기에 열을 가로 질러 합산내가 열 ID 및 날짜와 dataframe <strong>DF1</strong>이

ID <- c(101,101,101,102,102) 
date <- c("X20170101","X20170103","X20170106","X20170102","X20170104") 
df1 <- data.table(ID,date) 

ID  date 
101 X20170101 
101 X20170103 
101 X20170106 
102 X20170102 
102 X20170104 

과 열 ID로 dataframe DF2 많은 날짜로 (문자열 "XYYYYMMDD"등) 헤더

ID <- c(100,101,102,103,104) 
X20170101 <- c(1,NA,NA,2,1) 
X20170102 <- c(NA,1,1,1,NA) 
X20170103<-c(NA,1,NA,2,1) 
X20170104 <- c(2,3,NA,2,1) 
X20170105 <- c(1,1,NA,1,NA) 
X20170106<-c(NA,1,NA,2,1)   
df2=data.table(ID,X20170101,X20170102,X20170103,X20170104,X20170105,X20170106) 

ID X20170101 X20170102 X20170103 X20170104 X20170105 X20170106 
100   1  NA  NA   2   1  NA 
101  NA   1   1   3   1   1 
102  NA   1  NA  NA  NA  NA 
103   2   1   2   2   1   2 
104   1  NA   1   1  NA   1 
나는 열을 추적을 포함 DF1 에 추가하고 싶은

ing : 각 ID (예 : 101) 및 날짜 (예 : DF1에 X20170101) DF1 뺀 날 날짜 (e.g.X20170101)와 연속 한 사이 DF2의 해당 셀의 합 (예컨대 X20170102하지 X20170103). 즉, 새 df1은 다음과 같아야합니다.

ID  date count 
101 X20170101  1 
101 X20170103  5 
101 X20170106  1 
102 X20170102  1 
102 X20170104 NA 

감사합니다.

답변

1

저기!

library(data.table) 
library(dplyr) 
library(tidyr) 

df2 %>% gather(date,val,-ID) %>% 
    full_join(df1 %>% mutate(tag=1)) %>% 
    arrange(ID) %>% 
    replace_na(list(val=0,tag=0)) %>% 
    group_by(ID) %>% 
    mutate(grp=cumsum(tag)) %>% 
    group_by(ID,grp) %>% 
    summarize(count = sum(val),date=head(date,1)) %>% 
    ungroup %>% 
    mutate(count=ifelse(count== 0,NA,count)) %>% 
    select(ID,date,count) %>% 
    right_join(df1) 

# # A tibble: 5 x 3 
#  ID  date count 
# <dbl>  <chr> <dbl> 
# 1 101 X20170101  1 
# 2 101 X20170103  5 
# 3 101 X20170106  1 
# 4 102 X20170102  1 
# 5 102 X20170104 NA 
+0

변덕, 해결책 주셔서 감사합니다. 나는 한가지 문제 만 가지고있다. 코드에서 원본 df1에없는 ID = 102 및 날짜 = X20170101에 대한 새 행을 추가하고 있습니다. 이것을 피할 수 있습니까? – user3618451

+0

나는 편집을 참조하십시오 –

+0

편집 된 답변을 참조하십시오. 값 중 하나가 예상 한 결과와 다른 점에 유의하십시오. 그러나 사용자 측에서 실수 일 수 있다고 생각합니다. 티. –

1

dplyr 패키지를 사용 :

library(dplyr) 
count <- aggregate(df1$date), by = list(df1$date), FUN = length) 
df1 <- merge(df1, count, by = "date", all.x = TRUE) 

날이 작동하는지 알아 보자!

+0

두 번째 줄에 괄호가없고'df2 '를 사용하고 있지 않습니다. –

+0

으악! 머리를 주셔서 감사합니다 –