R Попарное сравнение столбцов матрицы без учета пустых значений

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

По сути, моя проблема такая же, как обсуждалось здесь: R: Сравнить все столбцы попарно в матрице, за исключением того, что я не хочу, чтобы подсчитывались пустые ячейки.

В примере данных, созданных из кода, полученного со связанной страницы:

data1 <- c("", "B", "", "", "")
data2 <- c("A", "", "", "", "")
data3 <- c("", "", "C", "", "A")
data4 <- c("", "", "", "", "")
data5 <- c("", "", "C", "", "A")
data6 <- c("", "B", "C", "", "")

my.matrix <- cbind(data1, data2, data3, data4, data5, data6)

similarity.matrix <- matrix(nrow=ncol(my.matrix), ncol=ncol(my.matrix))
for(col in 1:ncol(my.matrix)){
  matches <- my.matrix[,col] == my.matrix
  match.counts <- colSums(matches)
  match.counts[col] <- 0 
  similarity.matrix[,col] <- match.counts

}

Я получаю:

similarity.matrix =

    V1  V2  V3  V4  V5  V6
1   0   3   2   4   2   4
2   3   0   2   4   2   2
3   2   2   0   3   5   3
4   4   4   3   0   3   3
5   2   2   5   3   0   3
6   4   2   3   3   3   0

который считает пары без значений.

Мой желаемый результат:

expected.output =

    V1  V2  V3  V4  V5  V6
1   0   0   0   0   0   1
2   0   0   0   0   0   0
3   0   0   0   0   2   1
4   0   0   0   0   0   0
5   0   0   2   0   0   1
6   1   0   1   0   1   0

Спасибо,

Мэтт


person mattbawn    schedule 10.06.2015    source источник
comment
Можете ли вы показать ожидаемый результат ?. Попробуйте заменить '' на NA, т.е. is.na(matrix) <- matrix=='' и в вашем цикле match.counts <- colSums(matches, na.rm=TRUE)   -  person akrun    schedule 10.06.2015
comment
да. Я просто проверял это своими настоящими данными. Не могли бы вы тогда назвать это в качестве ответа?   -  person mattbawn    schedule 10.06.2015
comment
Я этого больше не вижу. Думаю, его убрали.   -  person mattbawn    schedule 10.06.2015
comment
Я вижу вашу петлю, но словесное объяснение того, что имеется в виду под сходством, значительно улучшило бы вопрос. Я действительно не думаю, что ссылка на другой вопрос может заменить его здесь. Кстати, вы можете не вызывать ничего matrix, поскольку это имя часто используемой функции.   -  person Frank    schedule 11.06.2015


Ответы (1)


Итак, вот ответ от Akrun:

сначала меняем пустые ячейки на NA

is.na(my.matrix) <- my.matrix==''

а затем удаление NA для match.counts

similarity.matrix <- matrix(nrow=ncol(my.matrix), ncol=ncol(my.matrix))

for(col in 1:ncol(my.matrix)){
  matches <- my.matrix[,col] == my.matrix
  match.counts <- colSums(matches, na.rm=TRUE)
  match.counts[col] <- 0 
  similarity.matrix[,col] <- match.counts

}

Что действительно дало мне желаемый результат:

    V1  V2  V3  V4  V5  V6
1   0   0   0   0   0   1
2   0   0   0   0   0   0
3   0   0   0   0   2   1
4   0   0   0   0   0   0
5   0   0   2   0   0   1
6   1   0   1   0   1   0

Спасибо.

person mattbawn    schedule 10.06.2015