如何将R语言Data Frame转换为matrix/array类型?
问题:将含日期列的数据框转换为matrix/array对象
我读取了如下的R语言数据框df:
df <- read.csv("https://raw.githubusercontent.com/Leprechault/trash/refs/heads/main/Dados_C3_data_planta.csv", sep=";") head(df)
输出结果:
# Data GLY_PN CRO_P MIPU_P CEN_P POA01_P CECRO_P COM_P MOR_PN #1 24-01-2024 53 40 3 0 0 0 0 0 #2 25-01-2024 56 8 0 24 9 0 0 0 #3 26-01-2024 0 27 0 47 26 0 0 0 #4 27-01-2024 0 0 0 0 0 6 43 48 #5 31-01-2024 0 0 0 62 35 0 0 0 #6 02-02-2024 0 0 0 50 50 0 0 0 # COPA_PN RHY_P SOR_P #1 0 0 0 #2 0 0 0 #3 0 0 0 #4 0 0 0 #5 0 0 0 #6 0 0 0
我需要将它转换为类为[1] "matrix" "array"的对象df_to_matrix,要求:
- 保留原格式,第一列为原
Data列的日期内容 - 其余列保持数值格式
- 试过
as.matrix()和data.matrix()都没成功,期望输出的结构如下:
# GLY_PN CRO_P MIPU_P CEN_P POA01_P CECRO_P COM_P MOR_PN #1 24-01-2024 53 40 3 0 0 0 0 0 #2 25-01-2024 56 8 0 24 9 0 0 0 #3 26-01-2024 0 27 0 47 26 0 0 0 #4 27-01-2024 0 0 0 0 0 6 43 48 #5 31-01-2024 0 0 0 62 35 0 0 0 #6 02-02-2024 0 0 0 50 50 0 0 0 # COPA_PN RHY_P SOR_P #1 0 0 0 #2 0 0 0 #3 0 0 0 #4 0 0 0 #5 0 0 0 #6 0 0 0 class(df_to_matrix) [1] "matrix" "array"
解决方案
问题出在as.matrix()会把所有列转成字符型(因为第一列是日期字符),而data.matrix()会把日期列转成数值(丢失日期格式)。要实现需求,可按以下两种方法处理:
方法1:将日期设为行名,矩阵保留数值列
这种方法下矩阵全为数值型,结构简洁:
# 提取日期作为行名 rownames(df) <- df$Data # 移除原Data列,转换为矩阵 df_to_matrix <- as.matrix(df[, -1]) # 查看类 class(df_to_matrix)
输出:
[1] "matrix" "array"
查看结构:
head(df_to_matrix)
输出:
# GLY_PN CRO_P MIPU_P CEN_P POA01_P CECRO_P COM_P MOR_PN COPA_PN RHY_P SOR_P #24-01-2024 53 40 3 0 0 0 0 0 0 0 0 #25-01-2024 56 8 0 24 9 0 0 0 0 0 0 #26-01-2024 0 27 0 47 26 0 0 0 0 0 0 #27-01-2024 0 0 0 0 0 6 43 48 0 0 0 #31-01-2024 0 0 0 62 35 0 0 0 0 0 0 #02-02-2024 0 0 0 50 50 0 0 0 0 0 0
方法2:保留第一列为字符型,其余为数值型的矩阵
如果必须保留第一列是日期(而非行名),可手动构建矩阵:
# 创建空矩阵,行数、列数与原数据框一致 df_to_matrix <- matrix(nrow = nrow(df), ncol = ncol(df)) # 设置列名 colnames(df_to_matrix) <- colnames(df) # 填充第一列日期(字符型) df_to_matrix[, 1] <- df$Data # 填充其余数值列 df_to_matrix[, -1] <- as.matrix(df[, -1]) # 查看类 class(df_to_matrix)
输出:
[1] "matrix" "array"
查看结构:
head(df_to_matrix)
输出:
# Data GLY_PN CRO_P MIPU_P CEN_P POA01_P CECRO_P COM_P MOR_PN COPA_PN RHY_P SOR_P #[1,] "24-01-2024" "53" "40" "3" "0" "0" "0" "0" "0" "0" "0" "0" #[2,] "25-01-2024" "56" "8" "0" "24" "9" "0" "0" "0" "0" "0" "0" #[3,] "26-01-2024" "0" "27" "0" "47" "26" "0" "0" "0" "0" "0" "0" #[4,] "27-01-2024" "0" "0" "0" "0" "0" "6" "43" "48" "0" "0" "0" #[5,] "31-01-2024" "0" "0" "0" "62" "35" "0" "0" "0" "0" "0" "0" #[6,] "02-02-2024" "0" "0" "0" "50" "50" "0" "0" "0" "0" "0" "0"
注意:这种情况下矩阵整体为字符型,但视觉上符合需求,且类为matrix/array。若需数值列保持数值型,只能采用方法1(因为矩阵仅支持单一数据类型)。
内容的提问来源于stack exchange,提问作者Leprechault
相关产品推荐
相关产品推荐

