Сравнение строк матрицы и замена совпадающих элементов - PullRequest
0 голосов
/ 05 мая 2020

Я хочу сравнить две матрицы. Если элементы строки в первой матрице соответствуют элементам строки во второй матрице, то я хочу, чтобы строки во второй матрице были сохранены. Если строки не совпадают, я хочу, чтобы эти строки были пустыми. Прошу прощения, что недавно у меня был похожий вопрос, но я все еще не смог его решить.

ВХОД:

> mat1<-cbind(letters[3:8])
> mat1
     [,1]
[1,] "c" 
[2,] "d" 
[3,] "e" 
[4,] "f" 
[5,] "g" 
[6,] "h" 

> mat2<-cbind(letters[1:5],1:5)
> mat2
     [,1] [,2]
[1,] "a"  "1" 
[2,] "b"  "2" 
[3,] "c"  "3" 
[4,] "d"  "4" 
[5,] "e"  "5" 

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

> mat3
     [,1] [,2]
[1,] "NA" "NA" 
[2,] "NA" "NA" 
[3,] "c"  "3" 
[4,] "d"  "4" 
[5,] "e"  "5" 

Я безуспешно пытался это:

> mat3<-mat2[ifelse(mat2[,1] %in% mat1[,1],mat2,""),]

Error in mat2[ifelse(mat2[, 1] %in% mat1[, 1], mat2, ""), ] : 
  no 'dimnames' attribute for array

Я боролся часами , поэтому любые предложения приветствуются.

1 Ответ

1 голос
/ 06 мая 2020

Вы были на правильном пути, но ответ немного проще, чем вы пытались. mat2[, 1] %in% mat1[, 1] возвращает совпадения как логический вектор, и мы можем просто установить несоответствия в NA, используя этот вектор в качестве индекса.

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

match <- mat2[,1] %in% mat1 # gives a T/F vector of matches


mat3 <- mat2
mat3[!match,] <- NA
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...