2012-01-12 8 views
8

2つのデータフレームをマージしたいが、複数のマッチがある場合は、行を複製したくない。代わりに、私はその日の観測を合計したいと思います。行を複製しないでデータフレームをマージする

からマージ:指定された列に一致する2つのデータフレーム内の行が抽出され、一緒に接合されます。 複数の一致がある場合、すべての可能な一致がそれぞれ1つの行に寄与します。ここで

は、いくつかのサンプルコードです:

days <- as.data.frame(as.Date(c("2012-1-1", "2012-1-2", "2012-1-3", "2012-1-4"))) 

names(days) <- "Date" 
obs.days <- as.data.frame(as.Date(c("2012-1-2", "2012-1-3", "2012-1-3"))) 
obs.days$count <- 1 
colnames(obs.days) <- c("Date", "Count") 
df <- merge(days, obs.days, by.x="Date", by.y="Date", all.x=TRUE) 

私は思います。2.

+0

'days'は' z.days'と同じですか?その場合、最終データフレームのカウントが{1,2,3,1}の2012-1- {1,2,3,4}になるようにしますか? (注: 'obs.days'には' 2012-1-3'が2つあり、 'days'には1があります) –

+0

はい、z.daysを数日編集しました。それをキャッチするためにありがとう。あなたの答えは、期待される出力を持っています。私はこれを形を変えて試しましたが、次に私はplyrを学ぶ必要があると思います。ありがとう! –

答えて

6

のカウント値とリストのみに2012年1月3日1時間の最終データフレームを希望しますそれらをマージしてからそれらを集約することをお勧めします(基本的に各ユニークのSUMを実行してください)Date

df2 <- aggregate(df$Count,list(df$Date),sum) 
    Group.1 x 
1 2012-01-01 NA 
2 2012-01-02 1 
3 2012-01-03 2 
4 2012-01-04 NA 
names(df2)<-names(df) 

をしかし、私は驚くばかりであるパッケージplyrを、お勧めします:

df <- merge(z.days,obs.days, by.x="Date", by.y="Date", all.x=TRUE) 
     Date Count 
1 2012-01-01 NA 
2 2012-01-02  1 
3 2012-01-03  1 
4 2012-01-03  1 
5 2012-01-04 NA 

今、あなたはaggregateを使用することができ、マージを行うには!特に、関数ddply

library(plyr) 
ddply(df,.(Date),function(x) data.frame(Date=x$Date[1],Count=sum(x$Count))) 
     Date Count 
1 2012-01-01 NA 
2 2012-01-02  1 
3 2012-01-03  2 
4 2012-01-04 NA 

コマンドddply(df,.(Date),FUN)は基本的に行います。

for each date in unique(df$Date): 
    add to output dataframe FUN(df[df$Date==date,]) 

は、だから私は提供してきました機能は、その日付のすべてのカウントの合計である、列DateCountと1行のデータフレームを作成します。

関連する問題