我有一个矩阵,它是由某些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
与行的原理相同。
答案 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