R: объединение матриц (не data.frames) - PullRequest
3 голосов
/ 15 сентября 2010

Слияние - очень хорошая функция: она объединяет матрицы и данные. Фреймы и возвращает данные.

Имея довольно большие матрицы символов, Есть ли еще один хороший способ слияния - без преобразования data.frame?


Комментарий 1: Небольшая функция для объединения именованного вектора с матрицей или data.frame. Элементы вектора могут ссылаться на несколько записей в матрице:

expand <- function(v,m,by.m,v.name='v',...) {
  df <- do.call(rbind,lapply(names(v),function(x) {
    pos <- which(m[,by.m] %in% v[x])
    cbind(x,m[pos,],...)
  }))
  colnames(df)[1] <- v.name
  df
}

Пример:

v <- rep(letters,each=3)[seq_along(letters)]
names(v) <- letters
m <- data.frame(a=unique(v),b=seq_along(unique(v)),stringsAsFactors=F)
expand(v,m,'a')

Ответы [ 3 ]

8 голосов
/ 15 сентября 2010

Вы можете использовать комбинацию match и cbind, чтобы сделать эквивалент слияния без преобразования во фрейм данных, простой пример:

st1 <- state.x77[ sample(1:50), ]
st2 <- as.matrix( USArrests )[ sample(1:50), ]

tmp1 <- match(rownames(st1), rownames(st2) )

st3 <- cbind( st1, st2[tmp1,] )
head(st3)

Отслеживание того, какие столбцы вы хотите, и объединение многих1 связи или пропущенные строки в одной группе требуют немного больше обдумывания, но все же возможны.

3 голосов
/ 15 сентября 2010

Нет, не без (а) перезаписи функции слияния или (б) создания новой функции merge.matrix() S3 (это был бы правильный подход к проблеме).

Вы можете увидеть в справке merge:

Значение

Фрейм данных.

Также функция merge.default:

> merge.default
function (x, y, ...) 
merge(as.data.frame(x), as.data.frame(y), ...)
2 голосов
/ 04 августа 2016

В пакете Matrix.utils теперь есть функция merge.Matrix.Это работает с комбинациями матриц, а также с заглавными буквами M Matrix, data.frames и т. Д.,Также не реализованы другие функции merge, включая all.x, all.y и т. Д.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...