2017-09-21 13 views
1

の日付に一致して列にわたって合計する私は列のIDと日付を持つデータフレーム<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を持つデータフレームDF2、多くの日付など(文字列「XYYYYMMDD」など)ヘッダ私がフォローを含む DF1 に列を追加したいと思い

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 

各ID(例:101)と日付(たとえば、 DF1でX20170101)、DF1マイナス1日にその日付(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 

ありがとうございました。

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

はこれが動作するかどうか、私に教えてください:dplyrパッケージを使用して

答えて

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

ムーディー、あなたの解決に感謝します。私には1つの問題しかありません。あなたのコードでは、元のdf1には存在しないID = 102と日付= X20170101の新しい行が追加されています。これを避けることは可能でしょうか? – user3618451

+0

私は、asab –

+0

を編集します編集された答えを参照してください、値の1つがあなたの期待された出力として述べたものと異なっていることに注意してください、しかし、私はそれがあなたの間違いかもしれないと信じます、 t。 –

1

+0

あなたは 'df2'を使用しておらず、2行目にかっこがありません –

+0

おっと!ヘッドアップありがとう –

関連する問題