尝试将字符型列名转换为日期类型却得到NA值的技术求助
字符型列名转日期出现NA的问题排查与解决
问题原因
目标列名格式为45292...3这类包含非数字后缀的字符串,直接使用as.numeric()转换时,由于字符串中存在...和末尾数字等非纯数字内容,转换结果为NA,后续基于NA执行日期转换自然也会得到NA值。
解决方案
先提取列名中的纯数字前缀,再进行日期转换:
方法1(使用stringr包)
# 若未安装stringr包,先执行安装 # install.packages("stringr") data2 <- structure(list(Type = c("Spend", "Orders", "Revenue", "Impressions", "Clicks"), `45292...3` = c("28553.05", "492", "35221.050000000003", "4977289", "20570"), `45293...4` = c("30068.25", "478", "30472.83", "5405811", "24283"), `45294...5` = c("27220.44", "442", "26138.42", "4692552", "20689"), `45295...6` = c("26637.33", "400", "22904.21", "4079760", "17514")), row.names = c(NA, -5L), class = c("tbl_df", "tbl", "data.frame")) date_columns <- colnames(data2)[2:ncol(data2)] |> stringr::str_extract("^\\d+") |> # 提取列名开头的连续数字 as.numeric() |> as.Date(origin = "1900-01-01") |> as.character() colnames(data2) <- c(colnames(data2)[1], date_columns)
方法2(Base R实现,无需额外包)
date_columns <- colnames(data2)[2:ncol(data2)] |> sub("\\D.*", "", x = _) |> # 去掉第一个非数字字符及之后的所有内容 as.numeric() |> as.Date(origin = "1900-01-01") |> as.character() colnames(data2) <- c(colnames(data2)[1], date_columns)
执行上述代码后,列名会被正确转换为对应的日期字符串(如2024-01-01、2024-01-02等),不会出现NA值。
内容的提问来源于stack exchange,提问作者firmo23
相关产品推荐
相关产品推荐

