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