【发布时间】:2018-10-10 18:00:10
【问题描述】:
这是我从 excel 中开始的示例数据(下一次,我要教我的客户关于整理数据的知识):
date_string
3/13, 3/17, 3/20
4/13
5/12, 5/20
我非常接近我想要的:
library(tidyverse)
library(stringr)
data <- str_split_fixed(data$date_string, ",", 3)%>%
as_tibble() %>%
gather() %>%
filter(value != "")
那么我就剩下这个了:
key value
v1 3/13
v1 43203
v1 5/12
v2 3/17
v2 5/20
v3 3/20
这已经足够好,我可以在 excel 中完成其余的格式化和排列,但是我在 R 中做得越多越好,特别是因为下次我更新最终产品时我必须再次这样做.我觉得有一个 lubridate 函数可以帮助我解决这个问题,但 mdy 和 date 不断返回错误。
我想要的值是上面的表格,但是是 m/d/y 格式。
更新
根据下面的答案,我添加了以下内容。这行得通,但可能有一种更优雅的方式来做到这一点:
data <- str_split_fixed(data$date_string, ",", 3)%>%
as_tibble() %>%
gather() %>%
filter(value != "") %>%
mutate(value =
if_else(
str_detect(value, "/") == T,
paste0(value, "/2018"),
as.character(as_date(as.numeric(value), origin = "1900-01-01")))) %>%
mutate(value =
if_else(
str_detect(value, "/") == T,
mdy(value),
ymd(value)))
我收到这些警告,但数据是我想要的:
1. In as_date(as.numeric(value), origin = "1900-01-01") :
NAs introduced by coercion
2. 1 failed to parse.
3. 5 failed to parse.
当最终的“值”列作为日期变量返回时,不确定它是如何“解析失败”的。 . .
【问题讨论】:
-
您应该分享您的预期输出。此外,当您遇到错误时,它们会附带错误消息以帮助您解决问题。你应该分享你得到的错误。
-
我认为你需要做一些条件测试来调用正确的函数并在右行使用正确的参数。您还需要做更多的数据调整
"3/13"不是mdy格式,因为没有年份。使用paste粘贴您想要的任何年份,例如ifelse(grepl("/" value), paste0(value, "/2001"), value)粘贴/2001任何values,其中已经有/。
标签: r dplyr tidyr lubridate stringr