左联接失败,因为 R 中的日期格式

Left-join failing because of date formats in R

提问人:PaulaCervilla 提问时间:10/23/2023 最后编辑:PaulaCervilla 更新时间:10/23/2023 访问量:53

问:

我有一个包含 2 列的 csv,一列是每周日期,另一列是每周每天的每日日期。

另一个 csv 中,我有每周数据,我想制作 csv 的副本,其中包含每日数据,并为该周的每一天复制相同的值,得到如下所示的内容:

 OBS  DailyDate column1 column2
1   2008-01-07 2008-01-07      5      5
2   2008-01-07 2008-01-08      5      5
3   2008-01-07 2008-01-09      5      5
4   2008-01-07 2008-01-10      5      5
5   2008-01-07 2008-01-11      5      5
6   2008-01-07 2008-01-12      5      5
7   2008-01-07 2008-01-13      5      5
8   2008-01-14 2008-01-14      20     20
9   2008-01-14 2008-01-15      20     20
10  2008-01-14 2008-01-16      20     20
11  2008-01-14 2008-01-17      20     20
12  2008-01-14 2008-01-18      20     20
13  2008-01-14 2008-01-19      20     20
14  2008-01-14 2008-01-20      20     20

我遇到的问题是,当尝试使用left_join执行此操作时,我会得到一个包含所有 NA 的数据帧,而不是一周中每天重复的每个值。

我相信问题出在日期格式上(对于其他 csv,它都按预期工作)。

为了解决这个问题,我尝试将日期列转换为具有不同函数的日期格式,但即使日期列在读取 csv 后似乎采用相同的日期格式,连接也会失败。

str(dates_master)
'data.frame':   4053 obs. of  2 variables:
 $ OBS      : Date, format: "2008-01-07" "2008-01-07" "2008-01-07" "2008-01-07" ...
 $ DailyDate: Date, format: "2008-01-07" "2008-01-08" "2008-01-09" "2008-01-10" ...

str(data_test)
'data.frame':   164 obs. of  3 variables:
 $ OBS    : Date, format: "2015-12-21" "2015-12-28" "2016-01-04" "2016-01-11" ...
 $ column1: num  323 974 528 375 351 ...
 $ column2: num  240 660 412 316 300 ...

因此,我认为如果我以非日期格式(例如 42464)将日期保存在 csv 中,然后使用看门人包转换为日期,它会解决问题,但事实并非如此。

我使用的代码是这样的:

data_test <- read.csv("C:/Users/me/Documents/monthly_and_daily_data/test.csv")
data_test$OBS <- janitor::excel_numeric_to_date(data_test$OBS)

dates_master <- read.csv("C:/Users/me/Documents/monthly_and_daily_data/dates_master.csv")
dates_master$OBS <- janitor::excel_numeric_to_date(dates_master$OBS)
dates_master$DailyDate <- janitor::excel_numeric_to_date(dates_master$DailyDate)

data_test_daily <- dates_master %>%
  left_join(data_test, by = "OBS", relationship = "many-to-many") %>%
     # left_join(data_test, by = "OBS", suffix = c(".daily", ".monthly")) %>%
      # left_join(data_test, by = c("OBS" = "OBS"), suffix = c(".daily", ".monthly")) %>%
  select(-OBS) %>%
  rename(OBS = DailyDate)

我错过了什么?

编辑正如评论中建议的那样,请在下面找到我的两个数据集的示例:

> dput(head(dates_master))
structure(list(OBS = c(39454L, 39454L, 39454L, 39454L, 39454L, 
39454L), DailyDate = 39454:39459), row.names = c(NA, 6L), class = 
"data.frame")
> dput(head(data_test))
structure(list(OBS = c(39454L, 39454L, 39454L, 39454L, 39454L, 
39454L), column1 = c(323.1428571, 974.3571429, 527.9285714, 375.0714286, 
351.3571429, 359.2142857), column2 = c(239.9880952, 660.202381, 
412.047619, 315.744186, 300.2325581, 280.3837209)), row.names = c(NA, 
6L), class = "data.frame")
r 对多 左联 接读.csv 门人

评论

1赞 GuedesBF 10/23/2023
请分享此数据的代码,而不仅仅是格式化的表格。你可以使用dput
1赞 Limey 10/23/2023
如果问题出在“日期格式”上,那么您的日期可能不会存储为日期,而是存储为字符。
1赞 GuedesBF 10/23/2023
Paula,请查看一些有用的教程和指南,比如这个。您应该让试图帮助重现您的数据和错误的人尽可能容易。通常,这意味着提供实际的数据集比提供多步骤的上游代码要好。 就是为此而生的。尝试调用以下代码,以便了解 dput 的用法:.您可以将此输出粘贴到问题中,并延长dputdput(head(dates_master))dput(head(desired_output))
1赞 GuedesBF 10/23/2023
这使我们有机会重现您的数据,因为我们无法访问您的本地文件,并且我们可能不愿意花精力下载数据。
2赞 MrFlick 10/23/2023
您提供的示例数据中没有重叠的日期,因此获得 NA 值也就不足为奇了。您确定实际数据中有重叠的日期吗?

答: 暂无答案