在R语言中如何将矩阵的指定列转换为numeric数值类型
为什么赋值字符串后全矩阵变回字符型
R中的普通矩阵是同构数据容器,要求所有元素必须为统一数据类型,类型优先级:字符型 > 数值型 > 逻辑型。当你向矩阵中存入字符串类型的值时,R会自动把整个矩阵的所有元素强制转换为优先级更高的字符类型,因此原本的数值列会全部变成字符串格式。
你之前用apply(input_matrix, 2, as.numeric)转换后Type列变成NA,本质是整个矩阵已经被强转成了数值型,字符串"SWAP"无法转换为数值所以变成NA,此时你再往数值型矩阵里写字符串,就会触发全局强制类型转换。
而你单独对后三列用apply(input_matrix[,2:4], 2, as.numeric)转换,得到的是独立的数值型矩阵,但如果直接把它赋值回原字符矩阵的对应位置,还是会被强转成字符,无法保留数值类型。
解决方案
最优方案:改用数据框(data.frame)存储
你的需求是不同列存储不同类型的数据,这恰好是数据框的设计场景,矩阵本身不适合该需求,操作步骤如下:
- 先将原矩阵转换为数据框:
# 转换时禁止自动把字符串转成因子,避免后续操作异常 input_df <- as.data.frame(input_matrix, stringsAsFactors = FALSE)
- 单独对指定列做数值转换:
# 对Tenor、Frequency、Rate三列批量转成numeric类型 input_df[, c("Tenor", "Frequency", "Rate")] <- lapply(input_df[, c("Tenor", "Frequency", "Rate")], as.numeric)
转换完成后,第一列Type保持字符串类型,后三列为数值类型,可以直接对后三列做数值运算,不会互相干扰。
必须使用矩阵的替代方案
如果有特殊要求必须用矩阵,可以使用列表类型的矩阵,但操作复杂度会高很多,非必要不推荐:
# 创建列表矩阵,支持每个位置存不同类型的数据 mat <- matrix(list(), nrow = nrow(input_matrix), ncol = ncol(input_matrix), dimnames = dimnames(input_matrix)) # 赋值第一列为字符串 mat[,1] <- "SWAP" # 赋值后三列为数值 mat[,2:4] <- as.data.frame(apply(input_matrix[,2:4], 2, as.numeric))
后续取数值列运算时需要用unlist()提取值,使用成本较高。
内容的提问来源于stack exchange,提问作者Yann Nitzpon
相关产品推荐
相关产品推荐

