Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/74.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
R 矢量化条件字符串操作_R_String_Dplyr_Substring_Sapply - Fatal编程技术网

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"