R按日期合并多个数据帧,不重复日期
我有两个数据框,它们分别包含日期列和数值列。我想按日期合并数据,这样我得到3列:一个日期和两个相应的值。当我把这些数据合并在一起时,结果是重复的日期和一些看似随机的值。我尝试了一些不同的合并(all=T,all.x=T等)以及左键连接,但没有成功。我做错了什么 现在我只合并两个表,但我确实需要合并其中的许多表,结果是每个日期都有许多关联的值R按日期合并多个数据帧,不重复日期,r,dataframe,datetime,merge,time-series,R,Dataframe,Datetime,Merge,Time Series,我有两个数据框,它们分别包含日期列和数值列。我想按日期合并数据,这样我得到3列:一个日期和两个相应的值。当我把这些数据合并在一起时,结果是重复的日期和一些看似随机的值。我尝试了一些不同的合并(all=T,all.x=T等)以及左键连接,但没有成功。我做错了什么 现在我只合并两个表,但我确实需要合并其中的许多表,结果是每个日期都有许多关联的值 > library(tidyverse) > GR_Raw <- read.csv("Daily__Jul-16-2020_0
> library(tidyverse)
> GR_Raw <- read.csv("Daily__Jul-16-2020_02_15_56AM.csv", sep = ",")
> names(GR_Raw)[1] <- "id"
> GR_02GB001 <- filter(GR_Raw, id == "02GB001")
> GR_02GA003 <- filter(GR_Raw, id == "02GA003")
>
> GR_02GB001 <- data.frame(GR_02GB001$Date, GR_02GB001$Value)
> names(GR_02GB001) <- c("Date", "02GB001")
>
> GR_02GA003 <- data.frame(GR_02GA003$Date, GR_02GA003$Value)
> names(GR_02GA003) <- c("Date","02GA003")
> GR_02GB001$Date <- as.Date(GR_02GB001$Date , format = "%Y/%m/%d")
> GR_02GA003$Date <- as.Date(GR_02GA003$Date , format = "%Y/%m/%d")
> GR_All <- merge(GR_02GB001, GR_02GA003, all=T)
> GR_Left <- left_join(GR_02GB001, GR_02GA003, by = "Date")
我想要的是:
Date 02GB001 02GA003
2019-12-26 0.386 0.802
2019-12-27 0.398 0.817
2019-12-28 0.459 0.899
2019-12-29 0.593 0.943
2019-12-30 0.805 1.279
2019-12-31 1.095 1.461
谢谢
编辑
是我的数据,我尝试了多次,得到了相同的错误结果。我的原始帖子已经使用了唯一的建议答案。通过上传的数据,我可以提出建议。有时您每天有一条以上的记录(请参见下面示例中的
df1
),然后,当您使用all=TRUE
选项合并数据帧时,这些记录将被保留,并且来自df2
的相应记录的值将被复制
# df1 has two records (or two lines) the 1999/01/01
df1 = data.frame(Date = c(as.Date('1999/01/01'),seq(as.Date('1999/01/01'), as.Date('1999/01/15'), by="day")),
var1 = c(1:16))
df2 = data.frame(Date = seq(as.Date('1999/01/01'), as.Date('1999/01/15'), by="day"),
var2 = runif(15))
df_all = merge(df1, df2, by = "Date", all = T) # both records from df1 1999/01/01 are still there and the related value from df2 is duplicated
旧答案
我试图模仿你的问题,但我没有这样的问题。
请考虑这个可重复的例子:
# Ex datasets with 5 days in common
df1 = data.frame(Date = seq(as.Date('1999/01/01'), as.Date('1999/01/15'), by="day"),
var1 = runif(15))
df2 = data.frame(Date = seq(as.Date('1999/01/10'), as.Date('1999/01/30'), by="day"),
var2 = runif(21))
# merging by dates I get the expected output with df1 and df2
df_merge = merge(df1, df2, by = "Date", all = T)
# merging with dataframes having the same set of dates
df3 = data.frame(Date = seq(as.Date('1999/01/01'), as.Date('1999/01/15'), by="day"),
var3 = runif(15))
df_merge2 = merge(df1, df3, by = "Date", all = T)
这是输出;正如预期的那样,我们有30行和15行,必要时NA
> str(df_merge)
'data.frame': 30 obs. of 3 variables:
$ Date: Date, format: "1999-01-01" "1999-01-02" "1999-01-03" "1999-01-04" ...
$ var1: num 0.0646 0.7934 0.6965 0.1142 0.0527 ...
$ var2: num NA NA NA NA NA ...
> str(df_merge2)
'data.frame': 15 obs. of 3 variables:
$ Date: Date, format: "1999-01-01" "1999-01-02" "1999-01-03" "1999-01-04" ...
$ var1: num 0.0646 0.7934 0.6965 0.1142 0.0527 ...
$ var3: num 0.000744 0.350087 0.429771 0.18886 0.484449 ...
谢谢,我知道这是它的工作原理,但我无法用我的数据实现它。我附加了一个链接到我的数据,如果你想查看它。我仍然无法将其正确合并。我正在处理您的数据,似乎您每天有多条记录。查看
length(unique(GR_02GB001$Date))
和tolength(GR_02GB001$Date)
@Jason如果更新的答案对您有帮助,请告诉我。非常感谢!我现在明白这个问题了。这有助于lotPlease重新打开,我已经包含了所有11行用于重现这些结果的代码,以及指向所用数据的链接。
> str(df_merge)
'data.frame': 30 obs. of 3 variables:
$ Date: Date, format: "1999-01-01" "1999-01-02" "1999-01-03" "1999-01-04" ...
$ var1: num 0.0646 0.7934 0.6965 0.1142 0.0527 ...
$ var2: num NA NA NA NA NA ...
> str(df_merge2)
'data.frame': 15 obs. of 3 variables:
$ Date: Date, format: "1999-01-01" "1999-01-02" "1999-01-03" "1999-01-04" ...
$ var1: num 0.0646 0.7934 0.6965 0.1142 0.0527 ...
$ var3: num 0.000744 0.350087 0.429771 0.18886 0.484449 ...