繁体   English   中英

left_join 导致 R 中的 null 值

[英]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。

  1. 首先转换为“真实” 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可以修复该部分。

  2. 子串。

    真的,这是一个 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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM