如何通过将现有名称列表将矩阵行或列名称更改为新名称?

时间:2019-02-03 18:35:25

标签: r database matrix names

我有一个矩阵,它是由某些ID号命名的行和列。 我有另一个数据库,其中包含两列-其中一个ID和一些名称。

我需要根据我在其他数据库中拥有的名称,将矩阵中的列和行的名称更改为其名称。

ID和名称列表:

#   ID  NAME  
#    1   chocolate   
#    2   hamburger   
#    3   nudels
#    4   rice  
#    5   sushi 
#    6   ice cream   
#    7   chicken  

我的矩阵:

#headline:  1   3   6  7
#           x   x   x  x
#           x   x   x  x
#           x   x   x  x
#           x   x   x  x

我想要什么:

#headline:  chocolate   nudels   ice cream  chicken
#           x           x        x          x
#           x           x        x          x
#           x           x        x          x
#           x           x        x          x

与行的原理相同。

2 个答案:

答案 0 :(得分:2)

给出以下矩阵

mat <- matrix(1:16, 4)
set.seed(1)
colnames(mat) <- sample(9, 4, FALSE)
mat
#     3 9  5  6
#[1,] 1 5  9 13
#[2,] 2 6 10 14
#[3,] 3 7 11 15
#[4,] 4 8 12 16

和此查找表

(lookup <- data.frame(ID = 1:10,
                      NAME = LETTERS[1:10], stringsAsFactors = FALSE))
#    ID NAME
#1    1    A
#2    2    B
#3    3    C
#4    4    D
#5    5    E
#6    6    F
#7    7    G
#8    8    H
#9    9    I
#10  10    J

我们可以使用match(colnames(mat), lookup$ID)查找旧列名称的位置,并使用此向量从查找表中对列NAME进行子集化

colnames(mat) <- lookup$NAME[match(colnames(mat), lookup$ID)]
mat
#     C I  E  F
#[1,] 1 5  9 13
#[2,] 2 6 10 14
#[3,] 3 7 11 15
#[4,] 4 8 12 16 

如果我们需要同时更改行名和列名 ,则可以按以下方式使用`dimnames<-`

dimnames(mat) <- rep(list(lookup$NAME[match(colnames(mat), lookup$ID)]), 2)

但是从这个问题我不确定这是否是OP想要的。

答案 1 :(得分:1)

这与马库斯的答案非常相似。

我也只是按要求包括行名更新,并利用向量的名称来构建查找向量。

df <- data.frame(
  ID = 1:7,
  NAME = c('chocolate', 'hamburger', 'nudels', 'rice', 'sushi', 'ice cream', 'chicken'))

# Create a lookup vector from the IDs/Names dataframe
lookup <- df$NAME
names(lookup) <- df$ID

# Dummy matrix for illustration purposes
mat <- matrix(1:16, 4)
set.seed(1)
colnames(mat) <- sample(7, 4, FALSE)
rownames(mat) <- sample(7, 4, FALSE)
mat
#>   2 3  6  4
#> 2 1 5  9 13
#> 6 2 6 10 14
#> 5 3 7 11 15
#> 3 4 8 12 16

# Update colnames and rownames according to the lookup.
colnames(mat) <- lookup[colnames(mat)]
rownames(mat) <- lookup[rownames(mat)]
mat
#>           hamburger nudels ice cream rice
#> hamburger         1      5         9   13
#> ice cream         2      6        10   14
#> sushi             3      7        11   15
#> nudels            4      8        12   16