提问人:PaulaCervilla 提问时间:10/23/2023 最后编辑:PaulaCervilla 更新时间:10/23/2023 访问量:53
左联接失败,因为 R 中的日期格式
Left-join failing because of date formats in R
问:
我有一个包含 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")
答: 暂无答案
评论
dput
dput
dput(head(dates_master))
dput(head(desired_output))