如何通过现有名称列表将矩阵行或列名称更改为新名称?
How to change matrix rows or columns names by a list of existing names to new?
我有一个矩阵,它的行和列由一些 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
和行一样的原理。
给定以下矩阵
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
和这个查找 table
(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)
查找旧列名的位置,并使用此向量从查找 table
中对列 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 想要的。
这与 Markus 的回答非常相似。
我也只是包括行名更新(根据要求)并利用向量的名称来构建查找向量。
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
我有一个矩阵,它的行和列由一些 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
和行一样的原理。
给定以下矩阵
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
和这个查找 table
(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)
查找旧列名的位置,并使用此向量从查找 table
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 想要的。
这与 Markus 的回答非常相似。
我也只是包括行名更新(根据要求)并利用向量的名称来构建查找向量。
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