如何对称填充仅上三角有值的方阵(tibble)?
对称填充方阵Tibble的对角线下方NA值
问题说明
存在一个方阵结构的tibble,仅对角线及其上方的单元格有有效值,对角线下方的位置均为NA。需要将对角线下方的NA,用对角线上方对应对称位置的值进行填充。
示例代码
library(tidyverse) Tibble <- tibble(A = c(5, NA, NA), B = c(1, 3, NA), C = c(6, 2, 4)) Tibble
当前输出
# A tibble: 3 × 3 A B C <dbl> <dbl> <dbl> 1 5 1 6 2 NA 3 2 3 NA NA 4
期望输出
# A tibble: 3 × 3 A B C <dbl> <dbl> <dbl> 1 5 1 6 2 1 3 2 3 6 2 4
解决方案
方法1:矩阵转换法(高效简洁)
利用矩阵的下标对称性处理,适合大规模数据:
# 将tibble转为矩阵 mat <- as.matrix(Tibble) # 填充对角线下方的元素:取转置矩阵对应位置的值 mat[lower.tri(mat)] <- t(mat)[lower.tri(mat)] # 转回tibble格式 filled_tibble <- as_tibble(mat) filled_tibble
方法2:Tidyverse行迭代法
贴合tidyverse的操作逻辑,逐行处理填充:
filled_tibble <- Tibble %>% mutate(row_id = row_number()) %>% rowwise() %>% mutate( across(A:C, ~ ifelse(is.na(.), pull(Tibble, cur_column())[row_id], .)) ) %>% ungroup() %>% select(-row_id) filled_tibble
内容的提问来源于stack exchange,提问作者Ian
相关产品推荐
相关产品推荐

