将矩阵字符值转数值并保留索引转为xts对象问题
解决字符转数值NA问题并转换为xts对象
问题根源
你的矩阵元素是带前后空格和千分位逗号的字符串(比如" 112,055.39 "),直接修改storage.mode时,R无法识别这些非数值字符,导致全部转为NA。
分步解决方案
1. 清理字符串并转换为数值矩阵
先处理每个字符串的冗余字符,再转数值,同时保留原行列索引:
# 加载依赖包 library(dplyr) library(tibble) library(xts) # 清理并转换:去除空格、替换逗号、转数值 master_zillow3_clean <- master_zillow3 %>% as.data.frame() %>% rownames_to_column(var = "date") %>% # 保留原行名(日期) mutate(across(-date, ~ as.numeric(gsub(",", "", trimws(.x))))) %>% # 清理字符串并转数值 column_to_rownames(var = "date") # 恢复行名 # 转为数值矩阵 master_zillow3_num <- as.matrix(master_zillow3_clean)
2. 转换为xts对象
xts要求行索引为时间类型,需先将原日期字符串转为标准Date格式:
# 把行名(日期字符串)转为Date类型 date_index <- lubridate::mdy(rownames(master_zillow3_num)) # 构造xts对象 master_zillow_xts <- xts(x = master_zillow3_num, order.by = date_index)
完整测试代码(用你的示例数据)
# 示例数据 sample_data <- structure(c(" 112,055.39 ", " 112,074.39 ", " 111,940.63 ", " 111,935.54 ", " 111,989.44 ", " 221,254.91 ", " 221,443.20 ", " 221,951.01 ", " 222,971.84 ", " 222,991.41 ", " 92,921.09 ", " 92,903.53 ", " 92,922.18 ", " 92,896.29 ", " 92,921.62 ", " 272,971.91 ", " 275,503.86 ", " 277,680.63 ", " 281,073.80 ", " 283,666.72 ", " 247,208.49 ", " 248,297.55 ", " 249,632.64 ", " 251,537.16 ", " 252,856.62 "), dim = c(5L, 5L), dimnames = list(c("1-31-2000", "2-29-2000", "3-31-2000", "4-30-2000", "5-31-2000"), c("77449", "77494", "79936", "11368", "11385"))) # 执行清理和转换 sample_clean <- sample_data %>% as.data.frame() %>% rownames_to_column("date") %>% mutate(across(-date, ~ as.numeric(gsub(",", "", trimws(.x))))) %>% column_to_rownames("date") %>% as.matrix() # 转xts sample_xts <- xts(sample_clean, order.by = lubridate::mdy(rownames(sample_clean))) # 查看结果 head(sample_xts)
关键细节
trimws():去除字符串前后的空格gsub(",", "", .x):删除千分位逗号,让R能识别为数值lubridate::mdy():将"月-日-年"格式的字符串转为标准Date类型,确保xts的时间索引有效
内容的提问来源于stack exchange,提问作者js80
相关产品推荐
相关产品推荐

