[英]left_join resulting in null values in R
我想通过“日期”列使用 left_join 组合数据表。 结果表合并了表,但连接到数据表的列都是 NA。
使用的语句:
merge <- left_join(activity, sleep, by =c("Date" = "Date"))
这可能是日期格式的问题吗? “活动”中的日期格式为 %m/%d/%y,“睡眠”中的日期格式为 %m/%d/%y %I:%M:%S %p。 合并表的日期格式为 %m/%d/%y。
首先转换为“真实” Date
-class 和POSIXt
-class 数据。
这是推荐的方法,除非在此加入之后您立即知道您将不会再查看时间戳。 也就是说,如果您甚至需要“活动之间的时间”或“每天计数”或类似的东西,那么您必须使用此选项真正 go。
首先,将所有日期转换为Date
并将时间戳转换为POSIXt
。 我将在这里猜测这些字段,但包括一个占位符,如果你有它们,你可以添加更多。
library(dplyr) # replace `c(Date)` with more if you have more, eg, `c(Date, Date2, Date3)` activity <- activity %>% mutate(across(c(Date), ~ as.Date(., format = "%m/%d/%y"))) # similarly, `c(Date)` sleep <- sleep %>% mutate( across(c(Date), ~ as.POSIXct(., format = "%m/%d/%y %I:%M:%S %p")), Date2 = as.Date(timestamp) ) merged <- left_join(activity, sleep, by = c("Date" = "Date2"))
我在这里创建Date2
是因为 R 不会将Date
s 与POSIXt
变量进行同等比较。 不幸的是,理由很清楚:
Sys.Date(); Sys.time() # [1] "2022-02-04" # [1] "2022-02-04 23:53:37 EST" as.numeric(Sys.Date()); as.numeric(Sys.time()) # [1] 19027 # [1] 1644036818
通过将POSIXt
转换为Date
可以修复该部分。
子串。
真的,这是一个 hack,只有在您有意从分析的 rest 中丢弃时间/日期时才真正有用。 (即便如此,我只是推荐这个我觉得很糟糕......)
sleep %>% mutate(Date2 = substring(Date, 1, 8)) %>% left_join(activity, ., by = c("Date" = "Date2"))
只是为了确定...您的数据有 2 位数的年份,对吗? 如果不是,则将"%y"
更改为"%Y"
,并将substring(Date, 1, 8)
更改为substring(Date, 1, 10)
。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.