R 矢量化条件字符串操作
我正在尝试对数据中的日期列进行以下矢量化操作。我发现了一个非常不雅观的解决方案,并且确信有一个更干净整洁的解决方案。玩具示例:R 矢量化条件字符串操作,r,string,dplyr,substring,sapply,R,String,Dplyr,Substring,Sapply,我正在尝试对数据中的日期列进行以下矢量化操作。我发现了一个非常不雅观的解决方案,并且确信有一个更干净整洁的解决方案。玩具示例: index <- c(1,2) input <- c('11-9-2019', '11/01/2019-01/31/2020') output <- c('11-9-2019', '11-01-2019') df_in <- data.frame('index'=index, 'data'=input) df_out <- data.f
index <- c(1,2)
input <- c('11-9-2019', '11/01/2019-01/31/2020')
output <- c('11-9-2019', '11-01-2019')
df_in <- data.frame('index'=index, 'data'=input)
df_out <- data.frame('index' =index, 'data'=output)
我可以使用sapply解决以下问题:
df_out$data <- sapply(range(1:2), function(x) ifelse(str_length(df_in$data[x]) > 12,
str_sub(df_in$data[x], -10, -1),
df_in$data[x]))
df_out$data <- str_replace_all(df_out$data, '/', '-')
df_out$data
有没有什么方法可以像我在str_sub中那样,在不依赖字符串索引的情况下,用一条向量化的线来实现这一点
谢谢 您可以使用gsub执行此操作:
解释如果您不熟悉正则表达式:
这将搜索具有一个或两个数字\\d{1,2}、后跟斜杠或破折号[/-],然后是一个或两个以上数字、破折号或斜杠,然后是四个数字的字符串。它仅用以破折号分隔的三组数字替换这些数字,并删除第一个字符串后面的任何内容。您可以使用gsub:
解释如果您不熟悉正则表达式:
这将搜索具有一个或两个数字\\d{1,2}、后跟斜杠或破折号[/-],然后是一个或两个以上数字、破折号或斜杠,然后是四个数字的字符串。它仅用以破折号分隔的三组数字替换这些数字,并删除第一个字符串后面的任何内容。一个想法是在删除任何多余的日期后,使用lubridate中的mdymonth day year,即
lubridate::mdy(ifelse(nchar(df_in$data > 10), substr(df_in$data, 1, 10), df_in$data))
#[1] "2019-11-09" "2019-11-01"
一个想法是在删除任何多余的日期后,使用lubridate的mdymonth day year,即
lubridate::mdy(ifelse(nchar(df_in$data > 10), substr(df_in$data, 1, 10), df_in$data))
#[1] "2019-11-09" "2019-11-01"
tidyverse中的另一个选项是使用单独的_行分割元素,然后使用lubridate转换为日期类
tidyverse中的另一个选项是使用单独的_行分割元素,然后使用lubridate转换为日期类
太好了,谢谢!他不熟悉正则表达式。现在我们将了解更多。太好了,谢谢!他不熟悉正则表达式。“现在我们将了解更多信息。”索托斯同意,但效果不好。您还应该通过查看lubridate了解更多信息。请参见下面的答案,特别是如果您有多个formats@Sotos同意,但效果不好。您也可以通过查看lubridate来获益。请参见下面的答案,特别是如果你有多种格式,我只是用这种方法来解决一个不同的问题,真的很喜欢。为胜利而奋斗。谢谢。我只是用这种方法解决了一个不同的问题,真的很喜欢。为胜利而奋斗。谢谢
library(lubridate)
library(dplyr)
library(tidyr)
df_in %>%
separate_rows(data, sep="-(?=[0-9]{2}[^0-9])") %>%
group_by(index) %>%
slice(1) %>%
transmute(data = lubridate::mdy(data)) %>%
pull(data)
#[1] "2019-11-09" "2019-11-01"