R - 按组计算不匹配

gia*_*iac 2 r sequence hamming-distance dplyr

我想知道如何按组计算不匹配的情况.

让我们想象这是我的数据:

sek = rbind(c(1, 'a', 'a', 'a'), 
        c(1, 'a', 'a', 'a'), 
        c(2, 'b', 'b', 'b'), 
        c(2, 'c', 'b', 'b'))

colnames(sek) <- c('Group', paste('t', 1:3, sep = ''))
Run Code Online (Sandbox Code Playgroud)

数据看起来像这样

     Group t1  t2  t3 
[1,] "1"   "a" "a" "a"
[2,] "1"   "a" "a" "a"
[3,] "2"   "b" "b" "b"
[4,] "2"   "c" "b" "b"
Run Code Online (Sandbox Code Playgroud)

为了获得类似的东西

Group 1 : 0 
Group 2 : 1 
Run Code Online (Sandbox Code Playgroud)

使用stringdist库来计算它是很奇怪的.

就像是

seqdistgroupStr = function(x) stringdistmatrix(x, method = 'hamming')

sek %>% 
  as.data.frame() %>% 
  group_by(Group) %>% 
  seqdistgroupStr() 
Run Code Online (Sandbox Code Playgroud)

但它没有用.

有任何想法吗 ?

快速更新:您如何解决权重问题?例如,如何在两个字符之间设置错误匹配时,如何传递参数 - 值(1,2,3,...).像失配之间b和c成本2失配之间a和c成本1等.

Ale*_*lex 6

这是另一种dplyr解决方案,不需要将数据转换为长/宽形式:

library(dplyr)
sek = rbind(c(1, 'a', 'a', 'a'), 
            c(1, 'a', 'a', 'a'), 
            c(2, 'b', 'b', 'b'), 
            c(2, 'c', 'b', 'b')) %>%
    data.frame

colnames(sek) <- c('Group', paste('t', 1:3, sep = ''))

sek %>% 
    group_by(Group) %>%
    distinct(t1, t2, t3) %>%
    summarise(number_of_mismatches = n() - 1)
Run Code Online (Sandbox Code Playgroud)

  • 好的解决方案 避免重塑数据. (2认同)