将大规模字符转换为日期格式,如r中的字符

将大规模字符转换为日期格式,如r中的字符,r,string,stringi,R,String,Stringi,我有一个1000万行的数据帧df。我想将“生日”列的字符格式从“xxxxxxxx”转换为“XXXXXX”。例如,从“20051023”到“2005-10-23”。我可以使用df$birthdayGo和sub date <- c("20051023", "20151023") sub("^(\\d{4})(\\d{2})(\\d{2})$", "\\1-\\2-\\3", date) # [1] "2005-10-23" "2015-10-23" dateas.date对向量有效 df$

我有一个1000万行的数据帧
df
。我想将“生日”列的字符格式从“xxxxxxxx”转换为“XXXXXX”。例如,从“20051023”到“2005-10-23”。我可以使用
df$birthdayGo和sub

date <- c("20051023", "20151023")
sub("^(\\d{4})(\\d{2})(\\d{2})$", "\\1-\\2-\\3", date)
# [1] "2005-10-23" "2015-10-23"

date
as.date
对向量有效

 df$birthday <- format(as.Date(df$birthday, "%Y%m%d"), "%Y-%m-%d)
sub()
适用于矩阵,但不适用于data.frames。因此,
as.matrix

df <- as.data.frame(matrix("20051023", ncol = 3, nrow = 3))
df$ID <- seq_len(nrow(df))
df[, 1:3] <- sub("^(\\d{4})(\\d{2})(\\d{2})$", "\\1-\\2-\\3", as.matrix(df[, 1:3]))

哦,天哪。这真的很有帮助。谢谢你,Avinash Rai。
as.character(as.Date(df$birth,“%Y%m%d”)
应该这样做这是真的。但是format()比as.character()快。见基准。谢谢,蒂埃里。如果我有两个或更多的列要转换,例如df[,c(3,5,7)],没有apply我怎么能转换呢?有没有什么方法能像.Date()或正则表达式那样快?对于(c(3,5,7)中的i){df[,我]谢谢你教我这项技能。这对我提高编码技能和概念非常有帮助。非常感谢你,蒂埃里。
microbenchmark(
  as.character(as.Date(df$birthday, "%Y%m%d")),
  format(as.Date(df$birthday, "%Y%m%d"), "%Y-%m%-d"),
  sub("^(\\d{4})(\\d{2})(\\d{2})$", "\\1-\\2-\\3", df$birthday)
)

Unit: microseconds
                                                                      expr      min       lq     mean
                              as.character(as.Date(df$birthday, "%Y%m%d")) 4923.189 5057.462 5390.313
                        format(as.Date(df$birthday, "%Y%m%d"), "%Y-%m%-d") 3428.657 3553.736 3697.660
 sub("^(\\\\d{4})(\\\\d{2})(\\\\d{2})$", "\\\\1-\\\\2-\\\\3", df$birthday)  713.699  739.997  815.737
    median        uq      max neval cld
 5150.0420 5394.4265 8225.270   100   c
 3594.7875 3665.9865 5753.200   100  b 
  763.0885  783.1865 2433.585   100 a 
df <- as.data.frame(matrix("20051023", ncol = 3, nrow = 3))
df$ID <- seq_len(nrow(df))
df[, 1:3] <- sub("^(\\d{4})(\\d{2})(\\d{2})$", "\\1-\\2-\\3", as.matrix(df[, 1:3]))
df <- as.data.frame(matrix("20051023", ncol = 20, nrow = 3))
df$ID <- seq_len(nrow(df))
library(microbenchmark)
microbenchmark(
  matrix = df[, seq_len(ncol(df) - 1)] <- sub("^(\\d{4})(\\d{2})(\\d{2})$", "\\1-\\2-\\3", as.matrix(df[, seq_len(ncol(df) - 1)])),
  forloop = {
    for(i in seq_len(ncol(df) - 1)){
      df[, i] <- sub("^(\\d{4})(\\d{2})(\\d{2})$", "\\1-\\2-\\3", df[, i])
    }
  }
)

Unit: microseconds
    expr      min       lq      mean    median       uq      max neval cld
  matrix  460.555  476.805  504.3012  494.1235  507.594 1122.522   100  a 
 forloop 1554.425 1590.774 1677.3038 1625.8390 1670.312 3563.845   100   b