Заменить значения в одной матрице значениями из другой - PullRequest
2 голосов
/ 24 апреля 2020

Я новичок в программировании ie, пытающийся сравнить две матрицы. Если элемент из первого столбца в mat1 соответствует какому-либо элементу из первого столбца в mat2, то я хочу, чтобы соответствующий элемент в mat1 был заменен соседним элементом (тот же ряд, другой столбец) на совпадение в mat2.

ВХОД:

mat1<-matrix(letters[1:5])
mat2<-cbind(letters[4:8],1:5)

> mat1
     [,1]
[1,] "a" 
[2,] "b" 
[3,] "c" 
[4,] "d" 
[5,] "e" 

> mat2
     [,1] [,2]
[1,] "d"  "1" 
[2,] "e"  "2" 
[3,] "f"  "3" 
[4,] "g"  "4" 
[5,] "h"  "5" 

желаемый ВЫХОД:

> mat3
     [,1]
[1,] "a" 
[2,] "b" 
[3,] "c" 
[4,] "1" 
[5,] "2" 

Я попытался выполнить следующее безуспешно:

> for(x in mat1){mat3<-ifelse(x==mat2,mat2[which(x==mat2),2],mat1)}
> mat3
     [,1] [,2]
[1,] "a"  "a" 
[2,] "2"  "b" 
[3,] "c"  "c" 
[4,] "d"  "d" 
[5,] "e"  "e" 

Любой совет будет очень ценится Потратили целый день, не заставляя его работать. Для меня не имеет значения, находятся ли элементы в матрице или во фрейме данных.

Спасибо.

Ответы [ 3 ]

3 голосов
/ 24 апреля 2020

ifelse равно vectorized, поэтому мы можем использовать его для всего столбца. Создайте логическое условие test в ifelse, проверив, является ли первый столбец значений 'mat1' %in% первым столбцом 'mat2', затем получите индекс соответствующих значений с помощью match, извлеките значения второго столбца с этим индексом или же возвращают первый столбец 'mat1'

mat3 <- matrix(ifelse(mat1[,1] %in% mat2[,1],
         mat2[,2][match(mat1[,1], mat2[,1])], mat1[,1]))
mat3
#     [,1]
#[1,] "a" 
#[2,] "b" 
#[3,] "c" 
#[4,] "1" 
#[5,] "2" 
2 голосов
/ 24 апреля 2020

Опция, использующая только логическую операцию, а не функцию

mat3 <- mat1
mat3[mat1[,1] %in% mat2[,1], 1] <- mat2[mat2[,1] %in% mat1[,1], 2]

Подмножество значений, чтобы найти те, которые встречаются в обоих, и замена их там, где они делают

1 голос
/ 24 апреля 2020

Вот еще одно базовое решение R

v <- `names<-`(mat2[,2],mat2[,1])
mat3 <- matrix(unname(ifelse(is.na(v[mat1]),mat1,v[mat1])))

, которое дает

> mat3
     [,1]
[1,] "a" 
[2,] "b" 
[3,] "c" 
[4,] "1" 
[5,] "2" 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...