如何将含X/Y变量组合列名的单行DataFrame转换为组合矩阵
将单行组合列名的DataFrame转换为X-Y矩阵
问题描述
现有一个单行DataFrame,列名格式为x{数值}_y{数值},对应变量X和Y的取值组合,列值为该组合代入方程的计算结果。需要将其转换为以X取值为行、Y取值为列、单元格为对应结果的矩阵结构。
示例输入的R代码:
x1_y1 <- 2 # x = 1,y = 1 x1_y2 <- 3 # x = 1,y = 2 x2_y1 <- 3 # x = 2,y = 1 x2_y2 <- 4 # x = 2,y = 2 df <- data.frame(x1_y1, x1_y2, x2_y1, x2_y2)
解决方案
方法1:使用tidyverse工具链(推荐,代码简洁)
借助tidyr包的函数完成数据结构重塑,步骤清晰易读:
# 加载tidyverse包 library(tidyverse) # 1. 将单行DataFrame转为长格式 long_df <- df %>% pivot_longer(cols = everything(), names_to = "xy_pair", values_to = "result") # 2. 拆分列名,提取X和Y的数值 long_df <- long_df %>% separate(xy_pair, into = c("x", "y"), sep = "_") %>% mutate( x = str_remove(x, "x") %>% as.numeric(), # 移除前缀"x"并转为数值 y = str_remove(y, "y") %>% as.numeric() # 移除前缀"y"并转为数值 ) # 3. 转换为宽格式,X为行、Y为列 result_df <- long_df %>% pivot_wider(names_from = y, values_from = result) %>% column_to_rownames("x") # 若需要纯矩阵格式,可转为matrix result_matrix <- as.matrix(result_df) print(result_matrix)
输出结果:
1 2 1 2 3 2 3 4
方法2:使用Base R(无需额外包)
通过字符串处理和矩阵填充实现转换,适合不想加载第三方包的场景:
# 提取所有列名并拆分 col_names <- colnames(df) xy_pairs <- strsplit(col_names, "_") # 提取X和Y的数值 x_values <- sapply(xy_pairs, function(pair) as.numeric(sub("x", "", pair[1]))) y_values <- sapply(xy_pairs, function(pair) as.numeric(sub("y", "", pair[2]))) # 创建空矩阵,设置行名和列名为X、Y的唯一取值 unique_x <- unique(x_values) unique_y <- unique(y_values) result_matrix <- matrix( nrow = length(unique_x), ncol = length(unique_y), dimnames = list(unique_x, unique_y) ) # 填充矩阵对应位置的结果 for(i in seq_along(x_values)) { result_matrix[as.character(x_values[i]), as.character(y_values[i])] <- df[1, i] } print(result_matrix)
输出结果与方法1一致。
内容的提问来源于stack exchange,提问作者Andres Gonzalez
相关产品推荐
相关产品推荐

